00:00
好,那我们呢,在数据库中就增加这么一个商品表,叫做product啊,然后接下来呢,我们在这个商品表当中呢,添加这样几个字段,一个是ID。啊,然后我们给他就是让他直接自增吧,啊然后是商品的名称啊,然后呢是商品的价格这块,商品的价格这块呢,我们就不考虑什么精度的问题了,也不考虑小数点的问题了,咱们就为了方便就给他一个int,接下来呢,我们嗯给一个版本号,因为呃乐观所呢,它实际上最核心的一个呃解决的一个点啊一个呃关键点就是我们为每一条记录呢增加一个版本信息,所以呢我们给他一个版本号,在接下来呢,呃我们定义ID呢为主件,然后最后呢,我们往这个数据库表当中呢,增加一条记录啊它呢就是一个笔记本吧,然后呢,卖100块钱好吧,然后我们把这个SQL语句呢复制一下在我们的。搜当中新建一个查询执行一下。
01:03
好,我们运行它。这样的话呢,我们刷新一下这个列表,我们看一下这个product,打开表。这个里面呢,就会有一条记录了,那这是我们做的第一个步骤,第二个步骤呢,我们创建一个实体类。Product。那我们在entity里面去把这个实体类创建出来。好,那这个实体类里面的几个属性呢,我也不一一的去写了,我们直接把它复制过来。好,这个就是对应刚才我们的四个属性啊,然后接下来呢。我们创建对应的map,这个也是一样的,跟之前都一样啊,我们呢,就直接去继承这个base map。那么在这个地方,我们右右键。新建这个product map,我们呢,让他去as tens a map,那同时呢,这块的泛型呢,我们写普。
02:05
对吧,啊好。然后。接下来呢,这个地方很显然它应该是一个interface对吧,嗯,那。在后面的这个过程当中呢,我们就要做一个测试,好,这个测试呢,我们把这个product map呢注入进来啊,因为这块呢,实际上我们要做的是一个乐观锁插件的一个讲解,所以呢,我还会写到这个插件的这个测试用例当中,那么在这个地方呢,我们先注入。Resource把刚才咱们写的product。Map给它注入进来啊。好,然后接下来呢,在下面这个地方咱们添加一个测试,这个测试的名字呢,我给它起成叫做con current update。叫做冲突测试哈,然后接下来呢,我们在这个地方呢,就模拟一下刚才咱们这个操作,当然了,如果想要真正的这个根据实际的场景去,呃,把这个应用程序创建出来的话呢,恐怕我们的这个时间不太够用,因为我们要搭一个外部网站,还要做一个表单,还要弄两个并发的这样的一个模拟的,呃,这样的一个用户,对吧,所以呢,我们就在当前的这个方法当中去类似的啊,去模拟一下这个并发,那怎么去模拟呢,就是先。
03:32
小李。取数据对不对,然后接下来。小王。取数据对吧?啊,我们在一个这个方法当中去模拟刚才咱们所说的那样的一个流程啊,意思是一样的,好,然后接下来小李取完数据,小王取完数据是不是小李。修改假设说我们是小李先点击的保存按钮哈,然后呢,小王。
04:01
修改对吧?啊,小李修改他改了什么呢?他是做了一个加50的一个操作,好小王修改他改了什么呢?他是做了一个减30的这么一个操作,对不对?好那接下来呢,我们就来看一看,最后。商品的价格啊。老板。看价格。老板看完价格昏过去了,是不是因为此时此刻商品可能已经卖了很多了,他便宜吗?那么便宜大家都来买,我记得之前我们有一个合作的一个用户哈,就是他们给那个中国移动做网上商城,然后你像移动联通这些运营商,他们不是经常会嗯,充话费送苹果什么的嘛啊,然后他们的那个在线商城里面也会卖那些苹果手机哈,好,然后呢,那个程序员呢,就是写程序的时候不小心把那个小数点就少写了一个,就是往前挪了一个,所以几千块钱的手机变成几百块钱了,然后他们那一天就卖了上万台手机啊,就商城库存里面上万台手机就全都卖出去了啊,那这个时候怎么办呀,就赔钱了嘛,当时就是运营商还给那个。
05:14
就赔了赔了赔了好多钱,然后那个程序员也受到惩罚了,所以这个其实就是很大的一个技术失误是不是,嗯,就因为一个小数点的问题,那我们这边也是一样的啊,就是因为这个一个并发修改的问题,然后就导致啊,我们这个这个商城啊,或者说这个呃,应用程序的这个运营方啊,他就他就赔钱啊这样一个状况,在我们的真正的企业的一个运营的过程当中,还是有的时候会发生的哈,那我们来看一下吧,这个是小李。他先把这个数据取出来,取出来之后呢,就product map,然后接下来点。第二第二那个有一个叫select by ID的一个方法啊,然后呢,我们就一。
06:02
好,然后这个地方呢。你也可以不写L啊,因为我们的product里面啊,我们用的是long哈,用的是long,那就写吧。这个地方是吧,啥都行啊,但是我这块写L吧。呃,我数据库当中写的是什么,我看一下啊。数据库当中啊,Big in是可以的,对吧?啊,正好对应那面的是了。啊,那这样的话,这就是我们小李取出的这个商品了,所以呢,我们管它叫PE,好接下来同样的方式,小王取商品。小王取商品,他是不是也取这条记录啊,啊,那他就是P2,明白吧?啊,为什么我要取两遍呢?因为在现实的情况下,确实是小李和小王取出的商品分别是通过不同的这个应用程序的进程取出来的,他们之间应该没有关系,所以像这样的一个记录,虽然我们这边都是一样的,但是小李和小汪他不能共享啊,不能共享他们分别改的是自己取出来的记录好,然后接下来呢,小李呢,对这个商品的价格呢进行修改,他加了50块钱,所以呢,小李修改商品P1。
07:17
点set price,它在原有的价格的基础上p.get price,它加了50。啊,这是小李对商品价格的一个修改,然后接下来呢,普duck map.up date by ID啊,因为这个PE呢,是之前从数据库中取出来的,所以呢,这PE里面肯定也也已经包含ID字段了,那所以呢,我们直接就可以进行一个。修改啊update,然后接下来呢,得到的这个result就是这个结果了,这个结果呢,就是是否修改成功啊好在这个地方呢,我们就写小李。
08:00
修改的结果。好,那么result如果等于一的话,就是修改成功,Result如果等于零的话,那么就是修改失败,对吧?嗯,好,那所以这块呢,我们就管它叫RESULT1,那同样小王修改。他实际上呢,也是一个差不多的过程,只不过呢,他修改的是P2啊,在P2这个商品的基础上呢,他进行了一个减法操作,他减的是30块钱,好,那么接下来呢,小王对这个P2呢,进行一个更新,好更新的时候呢,我们也得到一个结果就是RESULT2,那我们呢,对小王。修改的这个结果呢,也进行一个打印输出,所以这边呢,就是RESULT2,最后老板看价格,老板看价格,老板肯定也是自己打开商品的这个系统是吧,所以老板呢,Product map,然后点get select by ID,然后呢,他也是查询这个商品的啊,一个一个结果,那么老板呢,叫P3好,那么接下来呢。
09:08
老板,看一下老板。老板看价格。老板看到的价格呢,就是这个P3点,Get price。对吧?啊,所以这个就是我们整个模拟了三个人在同一时间的时间段内啊,做的这样的一个操作,那接下来呢,我们来右键运行一下。好,那么这个运行的结果呢,已经完成了,那么首先呢,我们来看一下。Update。PEPR。好啊,小王修改是成功了是吧,小李修改也成功了,我看一下啊,他怎么是。
10:08
右键打开。刷新老板看到的应该是70是吧,这块我是不是写的有问题,老板看价格是不是应该是P3呀。P3啊,点get price,然后接下来呢,再看一下,所以整个应用程序的执行是没有问题的,只不过老板看到的价格呢,我们那块改成P3啊,他就应该是70了,但是现在这个老板看到的价格可能也不是70,因为他是在70的基础上又减了30,所以老板看到的是40这块就正确了,对吧?啊所以呢,是在刚才我们看到的70的基础上又减了30,老板看40对吧?所以这是我们刚才模拟的操作啊,那现在呢,我们把这个先还原回来100。对吧,好,然后接下来呢,在这个地方。我们来看一看如何通过乐观锁来解决这个问题。
我来说两句