00:00
各位同学大家好,刚才呢,我们演示了事物中相关属性的设置,包括只读超时、回滚策略、隔离级别,以及最后咱们提到了传播行为,那我下面呢,特别把这个传播行为给各位通过一个具体例子,咱们再来演示一下相关的这些设置,那大家看一下啊,我们通过一个什么例子给大家演示,我在这里边给各位来画一下咱们要做的这个例子。就是关于掩饰事物的传播行为,我来写一下。传播行为。那我们来看啊,咱们目前呢,是这么一个例子,大家我们当前的例子。我们有一个买书的例子,有controller,有service,有do,那咱用它给它做个改造,给大家画一下啊,咱目前是这个样子。我画到这里。首先啊,这是我们的第一部分,就是这个control。
01:04
这是第一个。啊,这里写一下啊,Book controller第一部分。然后之后呢,我们有第二部分就是咱们这个和DA,我写到这里。啊,这个位置就有一个叫。这里啊,不考service。包括有一个book DAO。这是我们目前的这个组成部分。给大家啊一下,目前是这个样子,然目前就是control service,然后service里去调用我们的BA,然后最终实现我们的具体功能,包括咱们做了一个买的过程,在service里边调用了多次,包括你这里边查询,包括库存,包括扣余额等等。但是现在我这么来做,我在CT调service的过程中,我在中间再给它加上一层,这里再加一层,这一层呢,咱们建个service,比如起个名字叫这个叫这个checkout。
02:11
不考,我叫他。然后这里边我们做什么呢?咱们之前呢,每次只能买买一本书,现在比如我现在想要啊买就是多本书,就一次性比如买两本书,买三本书,买多本书,我想做这个事情就是一次性买多本书,然后咱怎么做呢?强调啊在这里边,比如咱们写上一个方法,这个方法比如我们就叫checkout。啊,就是检查嘛,或者检出啊,咱就写上一个check out的这个方法,然后这个方法后面咱肯定是一个事物方法,那我怎么做,我在check out里边的,让他去调用咱们service中的方法,然后让这个过程咱来模拟出那个传播行为的过程,大家注意我这个特点啊,然后后面这么来做controller,调这个checkout,这个book service。
03:11
啊,这个叫service,我写的完整点啊。这是一个service。然后咱通过out调之前那个在两个在这个里边呢,有两个方法都是数方法,咱们S里边当时有那个叫这个方法。这应该记得啊,咱刚写过有这个方法,而大家注意现在这两个方法,Checkout是竖方法,摆book方法,两个方法调用过程中,咱们演示出它的传播行为,因为咱们这里边已经加过那个trans这个注解,后面在这里边也加上trans这个注解,最把这个进行演示,通过设置它不同的传播行为,然后会看到它的效果。比如咱们现在加入一层checkout book service,然后做这个实现。
04:03
这是我们要做的一个具体例子,就是掩饰传播行为。这各位先明确啊,咱要做什么事情。然后这个说完之后,下面呢,咱就把这个例子我们给他进一步完善一下,写下这个例子,那咱看怎么来做啊,过程很简单,我把一些代码我就复制了,然后里边核心部分我们写一下,首先第一个咱们建个。我写到这里,这service呢,起个名字就叫checkout service。就是它了啊,这是我们见到service。建完service之后呢,我们在里边呢,创建一个方法,这方法我就叫checkout,因为咱要实现我可以买多本书,那多本书的话呢,肯定还有我们那个用户ID,这肯定没什么说的啊,就一个人可以买多本书,另外有你的图书ID,但是多本数的话,图数ID得用一个数组表示,我叫book ids。
05:04
这是我们定义的一个方法,就是买。多本书等。方法。然后这个之后我们再来创建一个checkout service实现类。Service实现类。然后让他实现我们这个接口。把方法进行实现。然后在里边咱们写这个具体的。功能的实现。那我们怎么做呢?Service上面先加一个注解,就叫service,然后在service里边呢,咱们注入我们那个就是上咱们之前写那个,把这个咱们给它先进来,那我加上一个注入private book service啊把它注入,然后注入之后在这里边来做一个调用。
06:08
但是调的时候呢,因为咱们要加上事物,之前book service里边这个摆book方法,咱们应该是已经加了事物,那这个时候我在这里边也给它加上事物,这个事物咱就加个注解可以了,因为配置已经做过了,我加到类上边,加到方法上都可以,如果加到方法上只对当前方法生效,如果加到类上面对类中的方法都会生效,那我就直接啊加到我这个就是方法上了,加上这个注解。这个transal这个注解。这个我们给它加上,然后加上之后在里边写下这过程,因为现在我这里边有一个书的ID,就是图书ID的数组,所以咱把它做一个遍历。便利之后得到里边的每个图书ID。
07:02
的便利下啊,然后咱们根据每个图书ID去调用service里边的方法进行买书,那我们来调一下啊book service里面的100BOOK传入图书ID,再传入用户ID,这样的话是不是就完成了,咱们现在就模拟出一个事物方法的调用,用checkout这个方法调,咱们摆book这个方法,两方法上应该都加了事物,所以咱就要演出来这个传播行为这个问题。这各位明确啊,所以现在把这个基本例子就完成了,完成之后最后呢,咱们改造下这个CR了,在CTR里边呢,那咱就不是写了一个book service,调刚才那个checkout service,把这个做调用这一段我先给它。然后咱们重新加代码加上,然后加上这个out。
08:05
Service在里边,我们调用check out中的方法进行实现啊,这个方法就叫checkout,然后咱们可以入,我们就是相关这个参数啊,咱给他传一下啊。呃,这个方法咱这么做,我给他也是重新写一个吧,就不用这个改了啊,咱把这个还给它注掉,咱重新写一个,就是把之前那个咱给他保留。啊,避免咱们写乱啊,咱重新写一个新的这么一个方法,这给它注掉啊,咱们往下重新来写。这个注入,然后加上一个方法public,我就叫checkout。就是它了啊,然后在里边呢,加上两个参数,第一个是那个图书ID的这个数组,我叫book ids,第二个加上的是用户ID,然后咱们调用service里边刚才这个方法传入图书ID,再传入用快递。
09:05
所以现在啊,这个准备工作我们就完成了,咱们要演示出来事物方法之间的调用,然后做到这个传播行为的演示。这个我们先讲这里,然后咱们马上进行演示。那我们怎么演示呢?给大家说明,首先第一个啊,咱们来到数据库表里边,我们说明一下咱要怎么演示大家看啊,我现在两本书,第一本第二本,而两本书,比如现在两本书我都想买,那大家看它的总的价格是110块钱,而我现在因为我是一本一本买,如果说买第一本的话,我的账户余额是100,比如咱改成这个101,给它看的明确啊,那我第一本书是不是肯定可以买101,这个应该能买成功,但是我现在如果说我再买第二本书的时候,这个价格是十,我用一块钱再买十肯定买不了,是不是会出错,应该咱是这么一个效果,而这个时候咱通过设置事物的隔离级别啊,就是它的传播行为,然后咱们来测试,看它最终会变成什么样的,因为咱们通过设置不同的传播行为,它的效果应该是不一样的,来用它来做测试。
10:19
这库存量我还是改成200啊,为咱们看的更明确,那这个具体怎么做,咱们看一下啊,首先第一个咱们这个。Checkout service这个不变啊,它还是这个,然后咱们把book service隔离级别传播行为给它改一下隔离级别啊,刚才说了两个隔离级别,隔离级别呢,默认应该就是买so中默认级别repeat read,目前是传播行为,咱就先设置成块的这个行为,那咱们测试啊,来到测试方法中,这是之前的方法,刚才咱们注掉了,给它注释掉,咱们重新操作。调用book ctrl里面这个方法叫check out,第一个传入一个数组,咱们写一个book ids,两本书的ID就是一还有二。然后把这个。
11:13
我们再加上就是我们这个用户ID啊,给它加上,然后注意一些代码。不相关的都给它去掉啊,应该都去掉了,然后现在我们执行大家看这特点啊,目前呢,要执行的话,应该是买两本书,第一本书,第二本书,再看它最终会怎么样,那咱们执行一下,看一下这个效果。丹麦让他执行。然后大家看啊,最终报错了,因为咱们买第二本书的时候,我这值就是一要里边再减十,肯定会有这个负数出现,我这个类型是一个无符号的,应该不能出现负数,所以它会出错,然后大家看表里面的变化,库存量200没有变化,然后这个用户余额101也是对的,它目前是这个效果,比如我现在啊,把传播行为设置成叫块的,也就是默认行为,它里边做了回滚,咱们一本书都没有买成功,为什么这个样子呢?咱看一下我们的分析过程啊,跟这个基本一致,只是数字可能有点不太一样,但是过程一样的,就是现在你注意啊蕊块的什么特点,它就表示如果说当前有事物,那就用当前事物,没有事物那就建个新的事物,而我这个时候呢,我现在是买了,就是购买这个书,虽然咱买了两本书,但是他们都。
12:39
不在此事务中执行,造成我现在场景怎么样,第一次其实成功了,第二次失败,当你现在一本书都买不了,因为他们都在当前事物中执行,这个叫对块的,当前有事物就用当前事物,没事物那就建个新的事物啊,这是第一个,那咱们再演示一个啊,我把这个值改一个。
13:02
改成request new来看它会怎么样,我们再试一下啊,还是把这个代码执行一下,看它什么效果。当他执行。然后大家看啊,最终肯定会出错,因为它里面那值肯定变成负数了,肯定会出错,那当然看表里边什么样的变化啊,先看图书,大家发现啊,第一本的库存是不是减一了,等于说他其实卖成功了,再看余额变成多少,是不是一啊,证明咱第一本的100块钱已经扣款成功了,你已经买成功了,第二本失败了,就是现在我成功的买了一本书,他为什么这个样子,看他的分享啊,因为request new的特点是什么。大家明确,不管当前是否有事物,他都会见到新的事物,比如我现在啊,在这过程中,同样的场景中,每次买书他都是在不可事物中执行,因此第一本书买成功,然后这个事物结束,第二本买失败,因为他们每次都见过新的事物,精执行,造成你最终第一本成功,第二本就失败了,他没有说一本都没买,都没买到啊,最终第一本成功,第二本失败,这个叫request new,也就是这里提到的啊,不管当前有没有事物,都会见的新的事物,新的事物跟之前事物不存在嵌套关系,之前事物会被挂起。
14:29
这就是咱们演示的事物的传播行为,最终啊看到的就是这个效果。所以咱们以上啊,就是把事物中的相关属性,我们就演示完成了。
我来说两句