00:00
好,那下面呢,那咱们就来看一下这个事物的属性啊,然后咱们刚才从A的transactional这个注解中是不是看到的有什么propagation isolation,对吧?然后read only,还有timeout,那咱们就来看一下这些属性都是干什么的啊?好,那我们现在呢,咱们重新把它给加到咱们的方法上啊,当然呢,你加到类上也行,只不过加到类上是对类中所有的方法都有效果,而咱们加到方法上,它只对方法有效果啊。好,然后咱们先来看一下咱们的第一个属性叫做只读,什么叫做只读呢?就比如说呀,我们现在咱们的一个事物里面的全部都是查询操作,那这个时候我们就可以来设置事物的只读,那我们设置了事物的只读之后,就是来告诉数据库,我们当前的事物中没有任何的写操作,那这个时候咱们就可以从数据库层面来优化当前的操作了,就比如说不加锁来保证数据的一致性。对吧?好,然后当然呢,每一个数据库的优化可能有些区别啊,但但是大家注意,你要知道这个东西它什么时候去用,只有当我们这个事物中都是查询功能的时候,咱们才能设置事物的指图,那我们通过哪个属性来设置,大家看啊,然后我们在这加上一个括号,里面呢,有一个叫做read only,这个属性就是来设置事物的只读的,那刚才也能看到,大家注意,你看这默认值是啥?First,对吧?也就是说我们有需要咱们才能设置,那什么时候才算是有需要呢?就是说我当前的事物中所有的操作都是查询操作的时候,咱们才需要把它给设置为处,那默认的情况下它都是false。
01:40
好,那如果我们当前咱们的这一个事物中有任何的一个增删改操作,就比如说我们现在咱们买书的这个功能。大家看你看在这对吧,这是不是一个修改,这是不是也是一个修改,那我们现在还能把它设置为只读吗?大家看好啊,叫做只读对吧,现在还能设置为只读吗?不能,哎,如果当前的事物中有任何一个增删改,大家注意,那我们再把设事物设置为只读,它就直接报错了,知道吧,好,所以说什么时候才能用,只有当当前的事物中全部都是查询操作的时候才能用,下面咱们来一个执行,大家看啊。
02:22
好,大家来看他给我们报的错是什么,咱们往下找。大家大家来看一下,这叫circle exception,他说我们当前的连接是怎么地的,是指读的我们在当前查询的过程中,然后我们的这个数据修改叫modification,对吧?然后数据修改的这个功能are notlo,什么意思是不被允许的,对不对?所以说大家注意什么时候咱们才需要用,只有当当前的事物中全部都是查询操作的时候才可以用,然后我们才可以从数据库层面去优化当前的操作,OK吧,好,那这个笔记啊,咱们直接看文档上的就行啊,大家注意,你看在这给大家写的也有,如果对增删改操作来设置只读会抛出以下异常。
03:07
对吧,就是我们刚才看到的这个异常啊。行,那下面呢,我们再来看咱们的第二个事物属性,叫做什么叫做超时,啥叫超时呢?大家想有没有这样的一种可能,就是我们事物在执行的过程中啊,因为各种问题对吧?然后呢,导致了我们当前的事物长时间它都没有执行完,就是导致咱们的程序卡住了,然后呢,这个事物在执行的过程中,它是要消耗我们当前数据库的一个资源的,对吧?好,那所以大家想,那我们能不能让这个事物一直执行下去,能不能,不能吧,如果这样的话,他是不是会一直来浪费我们当前数据库中的资源,所以说我们就可以通过超时属性来给他设置一个超时时间,在规定的时间中,如果说我们当前的事务没有执行完的话,怎么办?他就会强制回滚,然后并抛出异常,大家注意啊,可不是这个直接抛出异常的,而是强制回滚的,对吧,你想想你事物没有执行完,我们现在咱们要做的就是在。
04:10
规定的时间之内,如果你的事务没有执行完,咱们就不让他执行了,那不让他执行,大家想想你之前执行过的,执行成功的操作,咱们是不是也需要让他将它进行回滚啊,对不对?所以说是强制回滚并抛出异常啊,好,那这个东西咱们该怎么设置啊,比如说大家注意咱们把这个注释掉,然后下面咱们再来看,在这有个timeout属性。大家看它的默认值是负一,啥意思呢?负一大家注意表示的就是一直等的意思,也就是说如果我们当前咱们的事物卡住了,那没关系,那就一直等呗,直到等到我们的事物执行完成或者说报错为止,知道吧,所以大家注意啊,好,所以我们就可以通过这个属性来设置的怎么设置,比如说咱们在这设置一个三,这个三来表示的就是咱们的超时时间是几秒,三秒钟,如果三秒钟你的事物没有执行完,那当前的事物强制回滚并抛出异常,那咱们怎么写,比如说我们在这儿可以做个例子,让我们当前咱们的事物怎么样啊,然后让他这个事物功能,事物方法在执行的过程中让它休眠五秒,大家来看啊,然后咱们把这个复制过来。
05:21
这句话不知道大家有没有见过啊,这个其实它的底层用的也是我们现成的一个休眠,你看我现在把它给点开之后,大家看一下是不是也是thread点什么sleep,然后只不过就是我们在这个方法里面,你是不是自己需要去计算时间,它的时间也是什么,也是秒,那所以说它是不是就要把这个秒给我们算出来对不对,然后要么你自己算,要么你设置一个表达式,但是当我来使用了这个方法之后,大家来看你在这选的单位是谁。那它来表示的就是多长时间,比如说你这写的是seconds,后边写的是五,就是五秒,你在这如果写的是minutes,后边写个五,就是五分钟,如果你写个days,它表示的就是五天。
06:08
能看懂吗?如果你写的是hours,那就是五小时,能看懂不啊,这个时候就方便一些啊,但是大家注意它的原理是不变的啊,行,那我们现在的超时时间是三秒,我们当前咱们的这个程序休眠的时间是五秒,那所以说呢,在我们规定的时间之内,大家说它能执行完吗?执行不完,好下面咱们来一个执行,大家看啊。好,然后呢,我们现在咱们等三秒钟之后,然后他就会将我们当前的事物强制回滚,然后并且抛出异常了,大家看,你看他给我们的错是什么啊,叫做transaction timeout exception,叫做事物超时异常。好,然后这就是我们在设置了咱们的TIME2的这个属性之后所看到的一个错,如果在规定的时间之内,你的事物没有执行完,那我们在这就可以直接强制回滚并抛出异常,能看懂吧,这样的啊,行,然后下面大家看一下,你看使用方法怎么使用,在这咱们通过time out来设置这个属性,对吧?最后咱们观察的结果看好抛出的异常是什么啊,叫transa transa timeout exception,当然呢,大家注意它并不是只抛出异常的,还有一个最重要的点就是什么,他还会强制回滚,OK吧,强制回滚啊。
07:28
行,那这是咱们的第二个事物属性,当然这个东西大家也可以不设置,当然呢,我们也可以给他设置一个超时时间,只要是在规定的时间之内,没有完成当前的事物,咱们就可以强制回滚并抛出异常啊好,下面呢,我们再来看,那咱们的第三个事物的属性,叫做回滚策略。什么叫做回滚策略呢?也就是说我们当前呀,咱们的事物在遇到什么异常的时候会回滚,遇到什么异常的时候它不会回滚,然后它涉及到咱们这里面的几个属性呢?四个属性大家注意,咱们在这呢,可以先来看一下这个属性啊。
08:07
然后咱们可以把它先注释掉,然后在这咱们叫什么叫做嗯,叫做roll back,你看啊,叫做roll back for class name,这是因为什么而回滚,然后这个是back for,这也是因为什么而回滚,只不过是这里面来写的是类的全类名,而这里面我们来写的是异常所对应的class对象。知道吧,然后这个呢,是no rule for,什么意思叫做不因为什么而回滚,这是no rule for class name也是不因为什么而回滚,但是呢,他们两个也是跟咱们上面的区别一样,这里面咱们来写的是啥呀?写的是咱们的这个异常所对应的class对象,这里面来写的是咱们的异常的权类名这样的啊,那我们平常用的时候,咱们怎么用,大家注意,一般情况下这两个我们是不设置的。为什么呢?因为因为什么而回滚,咱们的这个声明是事物中呢?
09:04
是针对于所有的运行时异常,它默认情况下啊,这个roll back for,它就是针对于所有的运行时异常,它都是会进行回滚的。OK吧,只要是一个运行时异常,它都进行回滚,你看咱们的笔记里面写的有对吧,声明是事物默认只针对于运行时异常进行回滚,编异常,编译时异异常它进行回滚,不回滚不回滚,那所以咱们就可以通过这几个属性来设置呗,但是一般情况下,大家注意我们也不需要去设置因为什么而回滚,为什么?因为默认咱们只需要在。那运行时异常的时候进行回滚就行,那我们一般咱们来设置的是谁,就是咱们的no rule bag for和no rule bag for class name,这是不因为什么而回滚,比如说给大家来举个例子,你看啊,然后我们现在呢,然后咱们在这儿啊,然后我们在这个位置,然后咱们来输出一句话叫做一除以零,那大家说这东西是不是会抛出,抛出一个什么呀,抛出一个数学运算异常,那数学运算异常是不是就是我们的运行时一常对不对,好,然后我们现在啊,咱们让这本书他能够买成功,比如说这本书是80,然后我们把它的这个余额呀,咱们给它改成是100。
10:22
好,然后在默认情况下,只要是我们当前这个事物执行的过程中有运行时异常,默认情况下运行时异常就会造成回滚,比如说来大家看,我先把这些东西给它注释掉,现在咱们来一个执行大家看啊,那我们现在这本书能买成功吗?可以买成功,但是我们买成功之后,这后边是不是又执行了,又出现了一个异常,叫什么异常,数学运算异常对不对?好然后呢,这个时候大家说它会造成回滚吗?会,为什么?因为咱们说了默认的回滚策略,就是任何的运行时异常都会造成回滚,知道吧,所以说大家看你看啊,这个余额咱们一个刷新看改了没有,没有改,然后看这里面八十一百是不是也都没有改啊。
11:08
对吧?好,所以大家注意这是默认的回滚策略,那如果我们现在要想来设置,如果出现运行时异常的时候,如果出现这个数学运算异常的时候,咱们不让它回滚,那大家就可以通过这个回滚策略相关的属性来设置,比如说no for,它里面写的是什么,你看它的类型是啥。大家看一下是不是class类型的,所以说这里面咱们需要写的就是arithme exception.class OK吧,有腾老师呢,这是个数组呀,你看看这上面它是不是应该是一个数组类型,那数组咱们为数组类型的属性赋值,你在这不得加上一个大括号吗?那大家记不记得,对于咱们的注解的数组类型的属性来说,如果你当前的数组里面只有一个数据,那咱们的大括号是可加可不加的,大家有印象没有?
12:02
应该有吧,所以大家注意在这儿咱们只有一个数据,那所以说。这个大括号我们可加可不加啊,好,然后我们在这咱们再来一个执行大家看啊,然后现在它还是会报错数学运算异常,然后但是我们现在咱们这本书你能买成功吗?可以大家看啊,来这是它的库存,然后是99,然后呢,这是咱们的用户信息,它的余额已经变成20了,所以说这个时候造成回滚了没有,没有造成回滚啊,这个大家注意,所以说呢,No rule for,就是来设置我们不造成回滚的异常,当然呢,大家也可以来设置这个属性叫做no robot for class name里面来写的是啥,很好,它是字符串类型的。然后这里面也是一个数组,咱们需要来写的是我们的这个异常所对应的全类名,大家把它给写到这儿就完事了,现在我们在这儿,当然呢,大家注意,大家在做测试的时候,你可看好了啊,你可不能说你现在拿着一个什么来做例子,你可不能说你拿着一个购买买书失败的情况来做例子,对吧?你想想啊,我之前见有的同学在进行测试的时候,你这个书你都买不成功,这句话他根本都执行不了啊。
13:20
对不对,你余额不够,在这儿他就报错了。你的这个数学运算异常,它根本都没有执行到,你怎么来测试这个功能啊。所以说我们现在你要想把这个功能测试出来,大家看好,你一定得怎么做,你一定得保证你上面的这个功能它是能买成功的,知道吧,能买成功之后,然后我们这三个方法都能够正常执行,我们才能够观察我们当前的这个数学运算异常,到底会不会造成这个回滚的效果,知道吧?啊,一定要看好啊,你可不能说还像是咱们之前他都买不成功,这个circle这一行他都报错,你怎么让他往下执行这个数学运算异常呢,对不对,这个大家注意啊。
14:04
好,然后在这是100,然后在这这个咱们还把它的库存改成也是改成100,好然后大家看现在咱们再来一个执行,你看啊,数学运算异常还是会报,但是我们现在咱们这本书能不能买成功是可以买成功的,来啊看这这是库存99对吧,这是U的20,能看懂吗?所以说no back for和no back for class name这东西干什么的,就是来设置不造成回滚的异常,而back for和roll back for class name,然后来设置的是什么?设置的是咱们会造成回滚的异常,但是咱们一般都不设置,为什么?因为它默认情况下就是所有的运行时异常都会造成回滚,OK吧,所有的运行时异常都会造成回滚啊行,那所以呢,大家。这个就按照我们给大家写的这个例子,大家去测试一下它的回滚策略就行啊,好,然后咱们把这个呢,再给它注释掉,然后咱们在上面把这个属性也给它注释掉,所以说你看咱们这些属性你不设置行不行,可以,因为它都有默认值知道吧,所以说呢,咱们在这就是你需要用到哪一个,大家去设置哪一个属性就行啊。
我来说两句