00:01
好,接下来我们再来说另外一个插件啊,啊,那么这个插件的话呢,我们把它称之为一个诶乐观锁插件啊,那么这个插件是做什么设计的呢?诶主要就是来实现,诶比如说我们有这样的一个需求啊,当我们去更新某一条记录的时候呢,诶我们希望我在做这个更新之前呢,他是没有被这个别人进行更新的,好我们想实现这样的一个效果,呃,那么其实我们知道呃,我可以给你加锁呀。但是如果说你直接把这条数据给人家锁死以后的话呢,我们这个性能上面,诶,可能就会什么比较慢了啊,所以说呢,我们还是希望这个家锁的话呢,我们是有一个这个乐观的这个效果的啊,所以说我们把它称之为一个乐观锁插件,呃,那么这个插件的这个实现原理是什么呢?我们来给大家分析一下。啊,嗯,比如说我们在取出这个记录的时候呢,我们要获取一下当前这条记录它所对应的一个版本啊,假设就是二吧,然后比如说我们将来去更新的时候呢,诶,我就要把你这个版本二给他带上,带上以后呢,我们在执行更新的时候,大家需要注意它会去判断一下,判断什么呢?就是我手里面的这个版本跟你数据库里面当前这条数据的这个版本对应不对应,如果是对应的,那么我才会做这个更新操作。
01:20
好,并且的话呢,他会把你数据库里面这个version呢,诶在原来的这个版本之上呢,诶加上个一啊,就相当于我们已经更新过一次了,那么假如说这个条件是不满足的,也就意味着我手里面的这个版本跟这个数据库里面这个版本是不对应的,那么它就会更新失败,所以说呢,这就是一个这个乐观属的一个这个诶工作原理好啊,那么当然了啊,我们要实现这样的效果的话呢,诶我们就需要什么在我们这个实题类里面呢,必须要有一个字段啊,那这个字段的话呢,就是来去表示我们这个版本的,并且的话呢,我们必须要通过这个注解呢,诶给它去标注一下,好,那么实体类中有了这个字段以后呢,诶有了这个属性以后呢,对于我们这个表中来说的话呢,那么肯定也是需要有一个字段呢,来去表示我们这个version的好,所以说接下来的话呢,我们就来给大家演示一下这个乐观锁啊,它的一个具体使用。
02:14
好呃,那么首先呢,我们先把这个乐观手插件呢,诶给它注册一下啊。好,这个地方的话呢,这个啊我已经注册好了啊,所以说这个的话呢,我们这个直接把这个全类名呢拷贝进来就可以了啊啊这个是已经注册好了的,然后那么这个注册好以后呢,接下来我们要做的事是什么呢?诶我们需要在这个employee里面呢,诶假设我们加上一个。啊,这个字段吧,啊,这个in的这个version啊,比如说我就叫做version盘,好,然后呢,我们必须要去使用这个version,好必须要使用这个version呢,进行一个标注啊好方便我们操作的话呢,我们再给它加上这个盖赛的方法。好,把这个概率赛的方法来给它加上行,加上以后呢,呃,在我们这个数据库里面呢,我们还需要有对应的一个这个字段啊,来去描述它啊,所以说我们来把这个表呢,诶给它改变一下,我们来加上一列啊,比如说我们也叫做啊version。
03:14
好,我们叫做A。然后呢,也是11位。好保存一下。好,那么这样的话,我们表演已经修改成功了,修改成功以后呢,我们再来刷新一下,好,现在的话这都是空啊,我们暂时呢,都给它改成这个一啊。好保存一下,好,现在的话,我们这个数据呢,诶也已经构造好了,那么把这些都构造好了以后呢,接下来我们就可以来进行一个测试了啊好,回到我们的开发工具里面,找到我们的测试方法,然后呢,我们来写一下这个诶测试来测试我们这个乐观数是吧。好,测试我们的乐观数啊,我们把这个名字呢啊,再来copy一下啊。
04:07
好。加上我们的测试注解。嗯,然后呃,接下来的话呢,我们来做一个这个,呃,就模拟做一个更新操作吧,啊,模拟做一个更新操作啊行,那我们需要有一个。哎,Employee对象啊好,我们需要有一个这个employee对象。呃,然后呢,我们就比如说来去更新哪条数据呢?啊,我们就来更新这个15吧,啊,就这个Tom啊这样一条数据,好我们来看一下,那我们把这个数据呢,来set它的这个ID啊,就是我们这个TOMA15啊把这个设置到这好set我们的这个。啊,名字啊,Lastname就是我们的这个Tom,好,我们先来模拟这个,查回来这个原始数据啊,先把这个都写出来啊,Email的话呢,就是这个Tom硅谷了啊。
05:10
他艾特硅谷点。com。好,还有就是我们这个诶真的了啊,真的的话就是一个一啊,我们把这个一呢写到这,呃,另外一个呢,就是我们的age了,好,它是这个22岁,还有一个大家注意啊,我们必须要写上,就是我们这个涡啊,当前我们数据库里面这个涡就是一啊,那么我们将来查回来的话呢,那么这个version,诶就是我手里面拿到的,肯定就是你数据库里面当前的这个version了,好呃,那么接下来的话呢,我们就来做一个这个更新操作啊啊,比如说呢,我们就简单一下啊,把这个邮箱呢给它改一改吧,我们改成这个新浪好就可以了,其他的话我们就不改了啊,然后呢,我们去调用一个,诶employee map里面呢有一个update。把ID啊,然后呢,我们把这个employee对象给他传进去,好呃,那么传进来以后呢,我们就来做一个更新操作。
06:09
好执行一下。是啊,那么我们执行完成以后呢,大家来注意了啊呃,我们来看一下这条搜狗语句吧。这个搜QL语句上面呢,大家会发现啊,我们在更新的时候呢,诶它多了一个version,并且呢,在条件里面呢,诶也有一个version,这个是什么意思呢?它会做一个判断哈,我们来对比一下这个参数啊,那么这个呢,是我们的这个邮箱啊,一的话呢,对应的是我们的这个真的22呢,对应的就是我们这个age了,而这个二呢,它对应的其实就是这个涡了,那么其实我们应该还记得刚刚我们在这个对象里面拿到的涡是一,而这个一呢,其实诶就正好对应的是我们原来数据库里面的这个version是一个一,那么他就会拿上我手里面的这个一啊,就是我们传进来这个一,跟你数据库里面这个一呢,诶做一个对比,如果说这个是一样的,好,那我这一次更新操作就是可以的,并且呢,它会把这个version呢,诶给你改成二,就相当于加了个一,那么假如说我手里面拿的这个版本跟你数据库里面这个版本是不一致的,好,那对不起,我们的更新就不是啊,就不可能再成功了,好。
07:22
接下来我们来演示一下这个错误的情况,呃,那么现在的话呢。哎,我们来刷新一下我们数据库里面Tom啊,他的这个版本呢,已经变成二了,那么实质上的话呢,我们这个位置拿回来的版本应该就是二了吧,对吧?诶他拿回来版本应该就是二了,好那么比如说呢,他拿到这个数据以后呢,诶,他要去做更新操作了,但是不巧的是在他即将要更新的时候呢,诶另外一个人把这个数据呢更新了一下,那么这个版本呢,变成三了,好,这个时候大家注意他手里面拿的是二,而数据库里面呢是三啊,那么这个时候他再去做这个更新操作的时候,我们来看一看会出现什么现象。
08:10
好啊,那我们来看一下啊,它这个位置好像诶也没有报出什么错来是吧?我们来看看啊,是什么原因呢?他在更新的时候呢,诶把这个呃三呢设置到这儿了,然后呢,And version呢把二传到这了,诶但实际上我们应该看到的是什么呀?它这个二跟我们数据库里面的这个三,诶它肯定是不匹配的啊,所以说呢,我们来看看啊,他最后到底有没有更新呢?诶注意他说我更新了零条数据。好,呃,我们这样啊,呃,因为我们这个数据呢,确实也没改啊,所以说这个看不出这个现象来啊,我们就来改一下吧,好改成这个Jerry好这样的话呢,诶Jerry好像有了是吧。好,改成别的吧,比如说我们就改成这个Tom AA啊,这个位置的话呢,也是一个Tom AA吧,好我们随便写一个哈,然后这个时候大家注意了啊。
09:08
我们还是来看一下,呃,数据库里面呢,它暂时呢是三啊,比如说假设我们查回来的数据呢,它也是三,然后呢,还是在他更新之前呢,诶不巧的是另外一个人给他做了一个更新了。好,那么我们来把它保存一下,好,那么这个时候的话呢,他再去做这个更新操作的时候,我们来看看啊什么情况走一下。好呃,虽然说这个soql语句呢,诶也执行起来了,但是呢,大家注意啊,它最终呢说我update了零条数据,那么我们这些数据呢,实际上也传进来了,好但是呢,大家注意啊,我们看一下数据库它有没有更新啊,它其实并没有更新,为什么没有更新呢?我们来分析这条SQL语句,因为我手里面拿的这个版本呢是三,而数据库里面呢,啊,我在更新之前呢,已经有人把它改成了四,所以说呢,这个条件就不满足了,那么这个条件不满足的话呢,诶你前面的这个所有的更新操作,诶那都是不可能的,好,所以说呢,这个就是我们的诶乐观锁这个插件。
10:18
好啊,那么具体它这个原理的话呢,诶,我们也就不再带着大家呢这个啊,一行一行去分析了啊,因为我们在这个位置呢,诶其实也给大家这个都介绍过了啊,那么如果感兴趣的同学的话呢,诶,你也可以来到我们的这个插件里面。是吧,然后呢,看一下他这个except里面呢,诶帮我们写的这个代码好,你可以自己的去分析分析OK。
我来说两句