00:00
来,我们接着说啊,那么现在的话呢,我们已经知道了如何通过我们的support的生命是事物啊,来去管理我们的事物啊,但是大家注意啊,它不仅仅只有这么一个注解啊,而且呢,也不会这么简单是吧,你说我前面准备了那么多工作,就只为了讲这一个注解嘛,是吧?OK,那接下来的话呢,我们要去讲什么东西呢?讲的是我们乘30这个注解,或者说呢,也叫做什么事务管理的一些什么呀,属性设置。好,那么其实在这个里面大家注意了啊,它有特别多的属性,我们点进去来看一看,你看了啊,有最基本的value,有promoation,有isolation,然后呢,有time,有这个read only,还有什么呀,Back for等等等等一些东西特别多,那么这些东西我们都要给大家挨个去介绍上一次,好,那么首先我们先来去讲它其中的第一个属性,就是我们的事物的传播行为。
01:04
啊,那么在讲这个之前呢,我们需要通过一个问题来给大家,给大家去演示一下,我们才能把它给大家说明白啊,所以说呢,现在我们又要去加入一些东西了,我在这个service下面大家注意了啊。我在service下面,我去new一个接口卡Le啊结账对吧,来用一个接口,然后这里面的话呢,我们就写一个方法,就是好word就是什么呀,Checkout啊结账,然后呢,结账的时候呢,我是这么来做的啊,就是啊哪个人因为你要结账了嘛,我就可以什么同时去买多本书吧,能看明白这个方法吗?就是我结账的时候呢,比如说啊,那我总共挑选了好几本书,然后呢,我去结账,那么也就意味着其实这个就是模拟什么呀,同时去购买多本书的一个操作,看明白了吧,OK,那接下来我们把这个具体的实现也给大写出来,有一个class,我叫做好,然后呢,这个里面的话呢,我们去实现一个castl这个接口,好,这里面有一个方法,我们把它加上。
02:20
Checkout同样啊,这个也需要交给我们的LC容器去管理,所以说呢,该加的重点大家都必须要把它加上,那么对于这个checkout来讲的话,就是无非就是你去同时买多本书嘛,那么我们买一本书的这个逻辑是不是已经给他写好了,那我就迭代一下,你有你要买几本书,那我就去调用几次,这个方法是不是行了,好,所以说接下来你看了哈,我们这里面肯定是需要用到一个book shop service对不对啊,Com service啊,然后呢,加上我们的auto注解,然后这里面的话,我们就来去迭代一下for,迭代我们的BN,然后呢,每一次呢,我都通过一个book shop service啊,去什么呀,Buy book把名字传进去,把你的书号传进去,这是不就去买一本书啊,然后每迭代一次,我拿出其中的一个来,去买一本书,再迭代一次,我再拿出一个书号来,我再去买这本书,这个方法是不是?
03:20
明白了吧,OK,来写完以后大家注意了啊,接下来我要演示的效果大家注意了啊,回到我们的测试类里面,那么现在呢,我要去测试这个东西啊,就是public word test,我们的checkout好,怎么来测试呢?注意首先呢,我要先获取到我的这个接口。好卡,然后呢,这里面呢,我们也同样啊,把这个卡L给它拿到等于什么呀,CTXL改成B,好卡,然后呢,卡接口掉什么class诶把它获取到,获取到以后呢。
04:11
CR有问题吗?CHR啊,来把它什么写好啊,那么写好以后这个地方,比如说我就来模拟买书了啊,那么写个list,字符串类型的SBNS,等于有一个list。好啊,这里面的话我就来给它加上一些东西啊,就是is dns.abd我要买1001,好,我同时呢,还要去买1002,能看明白吧,然后呢,我就直接调用什么呀CA然checkout把to传进去,然后呢,同时买两本书,看明白了吗?OK,那么我们在买之前呢,我们先把数据重新构造一下,我那你的库存呢,都是十本,看懂了吧,但是余额呢,注意了啊,余额我只给你150块钱。
05:11
就是买一本呢是够的,买两本呢是不够的,听懂了吧,哎,买两本是不够的啊好来吧,那现在呢,我就来问大家一个问题,我这个方法执行的时候,它的结果是什么样的。啊啊,有这么几种答案哈,给你们一个选择题,就是两本都买成功啊,然后呢,买成功其中的一本啊还有一种情况就是什么呀,两本都没买成功,好吧,来三选一选一下吧,哪个第三个两本都没买成功是吧?有别的答案吗?有没有别的答案?
06:09
教都是第三个答案啊,啊,你不能想说你希望什么,是不是,你得去这考虑实际的情况对不对,当然我也希望两本都买不成功了,都两本都买成功了是吧?啊我也希望这样的对不对啊,所以说大家这注意了啊,这个实际的情况是什么样子的呢?我们来看一下,我来运行一次,好注意首先他肯定告诉我还是余额不足的,这个没问题吧,我们回到数据库里面来看数据啊,刷新一下,你发现钱减了没减了吧,那么减了以后呢,我就得去看我有没有买成功,哎,我一刷新发现买成功一百八对不对,那么剩50块钱,我去买70块钱的书,那肯定是失败的,好那么大家来想这种情况合理不合理,合理吗?合合不合理啊,你想一下,你在这个购物网上买东西,你购物车里面加了。
07:10
件东西你买的时候呢,余额不足了,它自动帮你买成功,能买的东西合理吗?不合理对吧?所以说呢,现在我们就希望去解决这个问题,那这个问题我们怎么解决呢?其实问题来自哪呢?问题是来自你在买这两本书的时候,你看这个方法里面,我有没有把它当成一个整体,没有吧,而且你看我总共买了两本书嘛,第一本,第二本,第一本买的时候我是成功的,那么对于我的购买操作来说,他也加上是我了,他成功以后是不是提交了,对吧?而我去买第二本的时候,他就失败的,但是呢,他这个方法呢,也是一个是我,那么他就失败了,但是呢,他的失败会影响我上面的这个吗?不会,所以说呢,如果说你想让他们同时成功或者同时失败,你就必须要把这两本书的购买操作是不是也放到一个事物中,那么这样的话呢,我就需要在这个地方加上一个圈,30秒看明白了吧,诶,我往这加上一个事物,那么这样。
08:10
这样的话呢,这个方法是不是也在一个事物中了,对不对,就算你看现在就是这种情况了,诶第一个第二个买第一本的时候,虽然说成功了,但是呢,我整个是在事物中的,我买第二个的时候,它是不失败的,那么应该整个事物都是失败的,所以说呢,诶这个我们就得看看会怎么办了啊来听我讲,现在我加上以后呢,我们再来回到数据库里面,把数据呢给他重新弄回去,都是十粉余额里面呢,150块钱,看到了吧,150块钱啊来去买。测试一下啊,我们去买。找一下。好,大家看啊,还是余额不足,但是呢,我们回到数据库里面看看,刷新一下,钱减了没来余额呢?啊,这个库存呢,也没讲这个效果是不是对了,对了吧,能明白了吗?OK,好,但是听我讲了啊,接下来我希望什么呢?就是在我代码现有的基础之上,就是这个注解必须得加,然后呢,这个地方的这个注解也必须得加,但是我希望你在买的时候,只要钱够,你就给我买成功100。
09:28
比如说我给你150块钱,你买其中的任意一本都是够的,对吧,但是呢,买两本是不够的,好,那我希望是能买成功其中的一本。怎么办咋办啊啊,注意这个时候我们就能提到事物的一个属性了啊,来这个属性我们回到我们的book service这个地方给大家去讲啊,我们用到其中的第一个事物属性,什么属性呢?来我把它放到这儿啊,大家听我讲就是一个传播行为啊,我们要讲的是好写到这个上面了啊,啊事物属性就是我们的第一个叫做啊事物的传播行为,明白吧,来这个东西的话,注意了啊,我们在这里面要怎么写呢?我们通过一个proagation来去写,然后呢,这个proagation里面呢,有两个值啊,我先给大家写出来,Proation我们最常用的一个是。
10:40
是这样的啊,把它写到这儿。好,一个是它,另外一个呢,叫做request new,好把它写到这可性啊来写到这个位置,呃,那么这两个有什么区别呢?啊,来给大家去说一下,首先呢,我来解释一下,什么叫做事物的传播行为啊,就是一个事物方法被另外一个事物方法调用时啊,就是当前的事物方法如何使用事物,这就是一个事物的传播行为啊,那么这个位置呢,有两个值,第一个值呢,它是我们的,它是我们的默认值,就是你不设置它的传播行为,那它默认就是这个能听懂吧,默认就是,然后呢,听我讲啊,它是什么意思呢?它是使用调用者的事物。
11:40
好,下面这个值呢,它是什么呀?哎,就是将调用者的事物挂起,然后呢,使用就是重新开启事物来使用,理解了吧,这是最本质的一个地方啊,就是不同的地方,好,那我们就来给大家去解释这两个东西它的区别是什么,如果说现在我想去实现买成功一本的话,那么我就要把它改成request new,我就可以买成功一本了,我们先来看结果,然后我再给你去解释啊。好,回到我们的数据库里面,库存呢都是十本,这个是没问题的吧,然后呢,余额也是150块钱,没问题,现在我再来测试,注意哈,现在我就是在刚刚的基础之上加上了这样的一个设置,然后呢,我们再去测试。
12:32
来大家来看,肯定是报错了啊,然后呢,主要看数据库里面的数据,我们来刷新一下,看到没有变50块钱了吧,然后再看这个库存里面是变成900了,看到了吗?OK,好,那么听我来讲,为什么会出现这个现象呢?那就是因为我们使用了一个pro.requests new。OK,接下来就来给大家去分析这个过程啊,好,怎么分析呢?我们通过这样的一个图来给大家分析啊,通过这个图,呃,如果说我们默认情况下就是一个require,它会使用什么呀?使用调用者的事物能明白吗?谁是调用者呀,就是你那个checkout,那个稍微啊,就是checkout这个方法是不是我们调用者呀,然后那个by book这个方法是不是被调用的呀,对吧,也就意味着我们研究的是by book这个方法,它是怎么去使用事物的。
13:29
能听懂什么意思吗?能理解吗?跟不上了,好,我跟不上,我再来说一次啊,我们把这个慢一点,但是大家一定要去理解啊,就是刚刚我们一本都买不成功的话呢,默认这个地方是什么值啊,是不是必要的呀,对吧,我说过嘛,这就是一个默认值吗?对不对,那我们刚刚能买成功一本,我是把它设置成P6了,对吧?这两个的区别是什么呢?就是区别,就是对于我当才的这个事物方法来讲,我是使用调用者的事物呢,还是说我使用一个新的事物呢?对吧,就是这个区别,那我们先来讲他去使用调用者的事物是一个什么现象,大家注意使用调用者的事物就是从这个checkout,呃,这个应该是by book啊,不叫这个方法,这个大家看成by book能明白吧?OK,我从check out开始,从这个地方开始,我要去买书了,那么当我去买第一本的时候,这个就是我买第1001的时候,对吧,因为这个方法呢,它也是。
14:29
一个事物方法,但是呢,我们设置的是一个require,它就会使用调度者的事物,就会使用到什么呀,使用的是check out所开启的这个事物,也就意味着我的买1001这一本书的这个操作也在我的TX1这个事务里面,好,但是这本是能成功的吧,好,那我接着再往上走,当我去买1002的时候呢,因为我还是用的票的,OK,所以说呢,他买1002的这个事物方法,他也会使用调用者的事物,也就是PE,也就意味着这个过程呢,它也在PXE里面啊,但是呢,它失败。
15:06
这个是能想明白的吧,那么大家来看现在我整个呢,就这么一个事物,从最开始的到这结束的,那么其中这个操作成功了,这个操作失败了,那么这个失败是在我整个的这个事物里面失败了吧,那么我要回滚的话,就是要回滚整个的这个事物,你看一下是不是把我刚才成功的这个也给他回滚了,明白了吗?OK,这就是个require,他这个事物的一个传播行为,就是记住这种特点就是什么呀,全程就有一个事物。明白了吗?全程就有一个是我,就相当于什么呀,相当于我再去买书的时候,我从这个位置开启了一个是我,然后呢,我再去调用这个by book方法的时候,因为你也是一个事物方法,但是呢,因为我设置的是require,就是刚刚是require的啊,就是这个值,因此呢,它就要什么呀,使用这里面开启的那个事物,就是把这个事物给它传递过来,传播嘛,明白吧,就把它传播过来,所以说呢,全程我们都是基于一个事物来去干的活,明白了吧,因此你这里面成功的一个,失败的一个,那么就会导致你成功的也要回滚,所说呢,就一般都买不成功,理解了吗?OK,那么接下来我们再来看,当改成request new以后,它又是什么现象,它叫做将调动者的事物挂起,然后呢,开启新的事物,那么我们来看还是我checkout从这个位置开启的事物去买书。
16:39
读,当我来到我的1001的时候,因为它也是一个事物方法,而且它设置的是request new,好,他要怎么做呢?他要把你的TX1挂起,从这个位置呢,开启一个新的事物,到这个位置结束,那么在这个事物里面,大家注意我1001是不是蛮成功了,对吧?那么也就意味着这个成功是在我的TX2这个事物里面成功的吧,好,那么你来想在我的当前事务里面成功了,那我就直接提交了,我当前的事务是成功了,那我就能提交了吧,OK,我这个操作就提交了,提交以后呢,接着往后走,注意TX1就继续了,继续呢,又走到又走到了这个位置,那么我们在买1002的时候,因为它也是一个class new,所以说整个的这个方法呢,它也要什么呀,从这个位置开启新的事务到这个位置结束。在这个过程中,大家。
17:39
他钱不够了,是不是失败了,但是这个失败是在我的TX3里面失败的吧,那么你想一下,你在TX3里面失败的,你能影响到我的TX2吗?两个事物,你失败了,你会影响我吗?两个事物是不相关的,能明白这个意思吗?所以说你失败了,他仅仅只会回滚TX3这个时候。
18:09
这个数它就不会回滚了,好,那么当这个TX3结束以后呢,我们的TXC继续,那走到这我们也就结束了,所以说呢,整个这个过程中,我们有三个事物,甚至于更多的事物,明白了吗?所以说你看一下在这个整个过程中是什么样子的呢?就是我是这么来做的,我从这开启了第一个事,我开始往后传播,传播到这以后呢,我又开启了第二个事,我去购买我的1001,他是成功的,它成功以后呢,这个事我就提交了,我跟你的TX就是这个的TX1,这是我的TX2,我的二跟你的一有关系吗?没有,我把你挂起来,我用的是二,再往后走,那我的TX1呢,又传递到了这个位置,但是呢,我在第三个事物里面,就是我的TX3里面,我去买1002,他是失败的,但是呢,他的失败是在我的TX3里面失败的,跟你的TX2TX1没有任何关系,所以说呢。
19:09
他只回滚当前的数据,TX2成功了就是成功了,最终呢,这个TX一再往后走,走到这它就结束了,因此在整个的这个过程中,我们存在了三个数,明白了吗?所以说这样的话,我们再来看,我买1001的时候成功了,那就是成功了,我买1002的时候失败了,那就是失败了,但是它不会影响我的1001的一本书,因此我们就能看到能买成功其中的一本,明白什么叫做事物的传播新闻了,没有,明白了吧?但是大家要注意哈,这个东西是我们per里面帮我们进行控制的,它跟我们底层的什么呀,数据库没有太大的关系。是他来控制你要开启几个事物的,但是注意哈,他开启的那个事物,哎,那是跟我们的数据就有关系的啊,那个数据会有关系,但是呢,这个事物怎么传播,就是这个事物到底要不要开启新的,这个是由来去控制的。
20:11
明白了吧,也就意味着你们当初在讲事物属性的时候,肯定没有听说过传播行为,对吧,他在买里面本来就没有这个概念,这个概念就是我们的通里面的一个概念,明白这个意思了吧,所以说呢,这就是我们要讲的第一个叫做事物的传播行为,理解了吧,OK。
我来说两句