00:00
好,那我们刚才呢给大家介绍了咱们的乐观所和悲观所,那下面咱们就通过代码呢来模拟一下咱们的修改冲突,那首先呢,咱们先来添加一张新的表,然后叫做商品表,大家来看F9执行,然后这里面一共有四个字段,首先第一个是主键ID,第二个是商品名称,第三个呢,然后是price价格,然后再往下呢是咱们的版本号。好,那下面咱们先来模拟一下这个冲突,然后我们再通过买be plus为我们所提供的乐观锁插件,直接来实现咱们的乐观所控制的功能。OK,好,那下面咱们再来添加一条测试数据,然后把咱们的实体类以及咱们的map接口都来创建一下,啊好,咱们来刷新,大家看咱们的表就已经创建出来了,OK吧,好,然后再往下呢,然后来创建咱们的实体类,那实体类的话,大家可以直接从咱们的笔记里面进行复制,因为毕竟这个东西的话也没有什么可写的,对吧。
01:00
好,然后p Du叫做product OK,然后把咱们的这些属性呢创建出来,然后通过咱们long book的注解,然后来为它生成相对应的get set方法,以及咱们的午餐构造to string OK吧,好,然后再往下的话,大家看,那下面咱们就需要来创建咱们的一个map接口了,来,在我们的map这个包下边来创建一个接口叫PO。Product map OK,大家还记不记得用法,我们现在使用的是MYT,所以说我们的map是不是需要来选择继承base map,也就是my be plus所提供的通用的map对吧?Extend,然后base map OK,那它的泛型的话,是不是应该就是我们要操作的实体类的类型?OK吧,好啊,行,那下面呢,我们就可以来进行一个简单的测试了,来找到我们当前咱们的测试类,来大家看一下,先创建一个测试方法,然后test,咱们叫P叫PRODUCT01OK来测试我们当前的一个商品的操作,这是我们的第一个测试,首先咱们都分为哪几个步骤来进行演示呢?首先咱们先通过小李和小王来获取我们当前咱们的商品的价格,然后呢,我们再通过小李和小王去修改这个价格,然后最终咱们再以老板的角度再次去查询我们最终这个数据库中存储的一个价格,OK吧,所以说大家来看第一步,咱们是小李。
02:40
小李,对吧,好。小李,然后来查询商品价格,OK,咱们来查,大家想想这个简单吧,然后呢,我们直接来访问谁呀,好,那我们现在咱们是不是应该是在这自动装配it out well,然后private,好,咱们来创建一个咱们product,不是说然后map OK啊行,创建出来之后它会报错,这个问题大家还有印象吧,咱们之前咱们在做入门案例的时候就说过对不对,因为我们当前的product map,然后他是把我们是扫描了这个当前map所在的包之后,然后是把它动态生成的一个代理实现类,然后交给了咱们的IOC容器来管理,所以说在这儿呢,Idea它匹配不到,但是呢,我们的代码能不能够正常执行啊,是可以的,那如果大家要想让他不报错,我们是不是可以在这个地方加上咱们的一个持久化的注解。
03:45
对不对,将它标识为一个持久层组件,OK,好,那下面呢,我们就可以继续操作了啊,首先大家来看,然后咱们通过product map点,我们现在先把我们的这个商品的价格查出来,然后咱们就叫做select by ID可不可以啊,这是不是就可以查询出来相对应的商品了,那我们当前咱们的这个商品只有一个它的ID呢,就是一,那我们在这直接把一给放进去就可以了啊好,OK,这个大家注意好,那下面的呢,我们是不是就可以来获取一个咱们的商品,比如说这个商品咱们叫product的礼,然后下面呢,我们在这直接来输出,比如说咱们输出小李,然后。
04:31
查询的商品价格,商品价格OK,然后冒号,这个大家说怎么来获取里,然后点get price就可以了,OK吧,好,那下面的同样的代码,然后我们再来获取一下小王。小王查询商品价格,那咱们把这个。变量咱们叫做product王,OK啊,实际上这个呢,也是小王。
05:02
好,在这咱们来访问的是product网点get price。好,那紧接着我们现在是不是小李和小王查询出来商品价格之后,是不是要在我们当前的商品的价格的基础上来进行更新,大家还记不记得小李的操作是什么?小李然后是不是应该要将咱们的商品价格然后加50,加50能看懂吗?那所以说我们现在该如何来进行操作呢?大家想一下,Product里然后点set price,然后我们是不是要在原来的基础上加上50,所以说大家来看那应该怎么写啊,是不是product里然后点get price加上50。这个大家能看懂吧,好,OK,然后获取完成之后,那我们现在咱们设置完成了,然后这个product里是不是就是我们更新之后的一个实体类对象了,然后我们直接通过product map,然后点什么方法,大家想想是不是修改的方法呀,里面有update的方法,有update的BYD,大家说这两个哪个简单,那肯定是咱们的update的BYD简单,因为我们现在已经将咱们的这个商品,也就是一所对应的商品,是不是已经把它给查询出来了,OK吧,好啊,所以说咱们在这直接干什么呀,直接把咱们的product里给放进来,就可以来完成一个更新的操作,OK吧,好,然后再往下,那小王的话,大家说他是干什么,是不是他是要将咱们的商品价格干什么,是不是应该是减去30没问题吧,好,那这个时候大家想,那他是不是也要在他所查询的基础上,然后来减上30。
06:51
大家看那应该怎么写啊,大家想啊,是不是应该是product王,然后点set price,然后product网点get price,然后在他所获得的价格的基础上减去30,但是大家注意他们两个是不是同时获取的,那既然是同时获取的,它获取的是不是也是100,他获取的是不是也是100,那这个时候其实咱们写到这儿,大家应该也能够发现他们之间的一个冲突了,OK吧,好,然后下面我们是不是再来进行一个修改,Product网点update啊,不对,应该是product map,然后点,然后update by ID。
07:32
能看懂吧,好,然后直接把product王给放进来,OK,那行,那我们现在小李和小王更新完商品之后,然后下面呢,我们是不是应该来看一下,如果说老板现在要来查询,然后咱们的商品价格的话,那我们是不是还需要再来查询一次,大家说是不是好,所以说怎么查简单直接把上面咱们的这个内容直接复制过来,这个叫product的老板,OK。
08:03
老老板板老板OK,没问题,好,然后在这呢,咱们来写一下,这个是咱们老板查询的商品价格,OK,在这直接把它给输出就行,那下面呢,那我们是不是就可以对咱们的方法来进行一个测试了,大家说我们最终老板查询出来的应该是几啊,大家想想。大家想一下,这个最终查询出来的商品价格应该是多少呢?大家想一下,然后他们两个同时查询出来的是不是应该是多少啊100,而我们的小李呢,他在100的基础上加上了50,先进行了更新,小王在100的基础上减去了30,又进行了更新,那大家说小王的操作是不是会把小李的操作给覆盖掉,对不对?所以说最终老板查询出来的价格是多少,70,而老板预期的价格又是多少,是先让小李加50变成150,再在一百五的基础上减30,应该是120,对不对?那所以说大家来看咱们最终,然后是不是就出现了我们刚才所说的问题,大家看一下。
09:10
没问题吧,对不对,好,然后大家来看我们在这儿所输出的一些信息啊来。好,然后我们当前小王查询出来的是不是100,小李查询出来的是不是也是100,没问题吧,好,然后我们最终呢,然后咱们老板查询出来的价格是多少呢?是70,所以说呢,这个就是我们刚才所说的这个问题,如果我们在这种情况下,咱们不使用锁的时候,大家是不是会发现,然后我们当前咱们最终的一个结果,并不是我们预期的一个结果,OK吧,那下面呢,那我们就通过my plus为我们所提供的什么呢?为我们所提供的这一个乐观所插件,然后来把这个功能给优化一下,OK。
我来说两句