00:00
好,那下面呢,我们来看咱们最后一个属性,叫做事物的传播行为。什么叫做事物的传播行为呢?大家注意你看啊,比如说我们现在咱们有两个事物方法,也就是说我们当前有两个方法,它上面呢,都加上了it transactional这个注解。然后他们两个呢,都有事物功能对吧?好,然后呢,我们现在呢,咱们的A中,然后去调用B方法,A方法,A事物方法,去调用B事物方法,那这个时候大家说呀,我们当前咱们的A本身是不是也有事物,对不对,那B本身呢,它也有事物,那我们的A去调用B的时候,咱们就会把这个A中的事物传播到B中,然后这个B该如何来使用事物,那就是事物的传播行为。比如说B它都有什么,它大家说它都有什么选择,它是不是可以来使用A本身的事物呀,它是不是也可以来使用它自己的事物,对不对?好,大家注意这两个效果完全不一样啊,你就比如说我们现在呢,然后咱们再去等到一会儿咱们去给大家演示这个效果,比如说我们现在咱们有一个什么样的方法,叫结账的方法,叫做CK,叫做check out。
01:13
结账的方法,然后结账的方法里面,我现在呢,我要买几本书,我要买两本书啊,我要买两本书,那我们每一次买书的操作,大家说是不是都是一个白book方法对不对?那所以说check out方法里面,我们就需要来执行两次白book by by book,大家注意啊,需要来执行两次by book方法,那这个时候大家想想,你看咱们当前的这个方法上,咱们是不是可以加上事物的注解,这个方法咱们是不是本身也有事物的注解,那这个时候大家想一下,那我们。是吧,你说那我们当前咱们的buy book,它到底该用谁的呢?他到底是该用咱们的结账的事物呢,还是用买书本身的事物呢?如果你要用结账的事物的话,那大家说我们当前咱们整个结账是不是算是一个事物,那所以说如果我现在买的这两本书,你第一本我能买成功,而第二本我买不成功,那大家说那我们当前这买两本书是同一个事物吗?那你只要有一本你买不成功,那我们当前整个结账的操作是不是都要进行回滚对不对?也就是说你只要有一本你买不了,那你一本你也买不了。
02:26
就是说我们就都买不了了,对不对?好,但是如果大家想,如果我们现在来使用的是谁,我们如果现在咱们来使用的是买书本身的操作,那也就是说如果我哪一本书买不成功,我只是在当前买书的操作中进行回滚。那所以大家想想,你这本书成功了。这本书,然后咱们没有买成功,那你是不是只在当前这个买书的操作中回滚,你对这个已经买成功的书,这个有影响吗?没有任何影响,OK吧?所以大家注意事物的传播行为,这个东西啊,还是非常有用的,咱们所设置的这个方式不同,那它最终的效果就不同啊,比如说咱们用checkout的这个事物,对吧,那就是你一本你都如果有一本买不了,那咱们一本都买不了对不对?如果说我们用的是买书本身的操作,买书本身的事物就是你能买几本就买几本。
03:22
OK吧,好,下面咱们就把这个功能呢给大家来实现一下,好,那我们现在咱们先把咱们的表给设计一下吧,比如说呀,你看我现在呀,然后我一共有多少钱,一共有100块钱,然后我要去买这个书,而我要买的是这两本书,那大家会发现他是不是最多只能买一本。因为咱们一共100块钱,是不是只能买得起斗破苍穹,然后如果你要想斗破苍穹和斗罗大陆你都买,那他是买不了的,对不对?好,然后我在这设置一个100,然后呢,我们把这个功能来做一下,比如说我们现在怎么办?我们在咱们的service中,咱们再来创建一个service层的check口,叫做叫checkout service,大家注意叫做结账,然后我们在这咱们再来创建一个实现类,然后叫做out service I PL,行,然后我们现在让他去实现check out service就完事了啊好,然后这个大家说是不是也要加上一个a service的注解啊?
04:28
OK吧,然后我们现在在咱们的controller里面,我们需要再创建一个方法public,然后VO叫做check out,叫结账,好然后那我们需要来访问的是哪个对象,叫做private checkout service checkout service OK out too wild,啊,好,然后呢,我们现在要干什么?看好我在这传进去一个in tIgEr类型的user ID,然后但是我进去一个in数组类型的book ID book ids。
05:02
也就是说我当前这个用户,他要买多本书能看懂吧,然后呢,我们直接来调用checkout service里面的什么方法,叫做checkout方法。OK,然后把谁传进来,User ID传进来,把book ids传进来啊好,下面我们在这个service中创建方法啊,这是什么方法?大家注意,这叫结账,其实就是买多本书,然后再来找到我们的实现类来对方法进行重写啊,那大家说你每买一本书,那不就是一个买书的过程吗?所以说我们是不是在这需要来自动装配一个什么对象,叫做book service对象能看懂不?哎,行,然后在这我们只需要怎么样啊,来AT来对我们当前咱们的这个数组进行循环,你每一本书都是一个买书的操作,然后是book service.by book把user ID传过来,然后把咱们的book ID,把每一个book ID传过来就可以。
06:01
能看懂吧,然后大家说,那这个买书的操作,咱们是不是也要来加上一个a transa的注解。OK吧,好,那我们就来测试一下呗,大家看好啊,别的咱们需要去改,不需要大家注意,别的咱们不需要去改啊,咱们把这些没有用的东西咱们就都给它关掉啊,行,然后呢,我们再来找到测试类,那我们现在呢,咱们就不要再访问这个by book的方法了,我们直接来访问谁book control.checkout咱们的用户ID是一,然后我们当前咱们的图书ID,大家看new,一个in tIgEr,然后大括号,我们要买的是第一本书和第二本书。能看懂吧,好。哎,那大家看,那我们当前咱们的checkout service I PL上这是不是有这个注解,有事物的事物的注解,对吧?然后我们当前买书的这个操作上,它也有这个事物的注解,对不对?好,然后那我们当前对于买书的操作,它到底应该用谁的,他到底是应该用我们当前结账的这个方法的事物,还是用它本身的事物呢?大家注意,它默认情况下来用的是我们结账的事物,也就是说呀,你只要有一本书你买不了,那我们当前那你一本你都买不了,知道吧?好,下面我们来一个执行,大家看啊好,然后这个报的错呢,肯定还是我们当前数据库中的错,就是我们对吧,咱们的这个超出范围的这个错大家来看啊,行,然后下面呢,我们再来看,你看数据库里面的一个变化,对吧,看好啊,这是一百一百,我们现在来一个刷新,大家看有变化吗?没有,这user里面大家看这是不是还是100啊。
07:44
所以说他现在应该用的是谁,应该用的是我们当前结账的事物,然后所以说我们在结账的整个操作中,你只要有一本书你买不了,那我们当前的你一本你都买不了。那我们就任何一本大家都买不了,OK吧,因为我们回滚呢,是整个结账的操作能听懂不好啊,那下面呢,如果那我们现在咱们该如何来设置它的其他方式,比如说我现在我要来使用的是谁?我要来使用的是我们当前咱们买书它本身的一个食物,那怎么办?咱们在这把它注释掉,大家注意你应该去改谁啊,我们应该在哪设置,你应该设置的是买书的操作中,在买书的操作方法上来设置,还是在我们结账的方法上来设置,咱们在这一直说的是什么,我们当前买书的失误应该是在哪来执行,就是买书的这个操作要使用谁的失误,是它本身的失误,还是我们调用买书的操作的结账的失误,对不对?所以你要在买书这里面来设置啊,怎么写叫做propagation,大家注意,这个属性就是来设置我们当前的传播行为的。
08:54
对吧,然后大家如果说你学习过view的话,大家都知道咱们在view里面是不是有一个这个,当我们去给这个页面中的标签来绑定事件的时候,对吧?然后我们的这个事件所对应的函数中是不是有个even的对象,Even对象中就有一个方法叫做阻止事件的传播,叫做stop propagation。
09:16
叫做阻止事件的传播啊,有印象吧,所以说这个是传播的意思啊,好,然后呢,我们大家来看它的值什么类型的,Propagation类型的,这也是一个啥枚举,能看懂吧,然后我们现在呢,然后咱们这个默认值叫做required,什么意思大家应该都知道,来使用谁来使用的是调用者的事物,也就是咱们的结账的事物,然后这里面呢,它还有一个属性,大家看啊,叫做propagation,然后点什么大家注意。Require,咱们刚才是不是已经看过啦,然后这个默认值是不是就是它,我们现在需要用的叫做requests new requires new。来使用的是谁?来使用的是他不使用我们当前结账的实物,然后而是在我们执行咱们的买书的操作的时候,来开启一个新的实物,其实也就是说来使用他自己的事物,OK吧,行,大家看啊,我现在我再来一个执行,你看啊,这个时候效果就不一样了啊,这个时候咱们使用的是买书的操,买书的失物,那所以说如果你的书买不成功,那我们当前只在当前买书的操作中进行回滚,OK吧,然后下面大家看好,我们现在咱们来一个刷新,诶你看变成多少了20了对吧?然后这里面大家再来看,你看这个是不是变成99了,所以说是不是就是能买一本就买一本,能买几本就买几本。
10:41
OK吧,行,大家注意,这个是我们事物的传播行为啊,大家要知道我们是通过哪个属性来设置的,叫做propagation这个属性来设置的啊好,那下面呢,我们来看一下咱们事物的传播行为,看咱们的笔记里面来写的啊,在这呢,大家注意,然后咱们观察结果对吧?然后呢,我们如果说要把这个注解它的一个proagation属性来设置为required,这是默认的情况,对吧?然后这个时候大家注意来实现的是谁使用的是谁使用的就是我们结账的事物,如果说我们现在咱们使用的是propagation.repair new的话,那我们当前呢,然后咱们来使用的就是谁啊,使用的就是我们买书的这个食物,OK吧,好,当然它也有一些其他的值,但是我们一般情况下,咱们用的比较多的就是咱们的这两个,一个叫require的,使用的是咱们调用者的事物,然后如果说我们用的是requires new,那我们则使用的是被调用。
11:42
被调用的方法本身的实物OK吧,行,大家注意,这是咱们的事物的传播行为啊。
我来说两句