00:00
好,下面呢,我们来看一下my bet plus所提供的乐观锁插件,那首先呢,咱们先来看一个场景,比如说我们现在呢,咱们有一件商品,大家注意这个商品的成本价呢,然后是80元,售价呢是一百一百元,然后老板现在呢通知了小李,大家注意这里面一共有两个角色,一个是小李,一个是小王,然后首先先通知了小李,然后呢,让小李把商品的价格增加150元,那所以说大家想到这个地方的时候,老板是不是应该是要把最终的价格定为多少150,大家注意,因为咱们的售价是100块钱啊好,然后呢,小李呢正在玩游戏,然后耽搁了一个小时,那正好一个小时之后,老板觉得商品价格加到一百五的话,是不是有点贵,然后可能会影响销量,所以说他又通知了小王,要把商品的价格再降低30元,那大家要注意这个降低30指的是什么,降低30是不是应该。
01:00
但是在我们更新到一百五之后,然后在一百五的基础上,然后降低30,那所以说这个时候老板的预期的一个售价是不是应该是120元,好,那这个时候小李玩完游戏之后啊,然后他跟小王同时去操作了我们当前这个商品的后台系统,然后小李在操作的时候,大家来看他取出来的数据是不是应该是100元呢?那既然他们两个是同时操作的,那所以小王取出来的是不是应该也是100,大家来看,好,那这个时候然后小李先将价格加了一加了50元,把最终的150元存储到了数据库中,然后小王呢,又把我们当前咱们的商品的价格减了30,但是大家要注意小王他现在获取的价格是不是也是100,对不对,所以说他将商品减了30之后,是不是就变成了70了,他把70更新到我们的数据库之后,大家想想,那当前商品的价格是不是要比咱们。
02:00
我们的成本价还要低十元,那这个时候老板不就亏钱了吗?大家想想,那如果说这个功能是大家去实现的,你让老板亏了这么多的钱,那你给老板补吧,是不是这样的啊?好,那这个问题我们可以通过什么来做呢?大家注意,我们可以通过乐观所和悲观所,然后来处理这个问题,那首先呢,咱们先来说一下悲观所,首先悲观所呢,然后表示的就是比较归悲观,如果我们当前呢,把这个数据加了锁之后,比如说小李在操作这个数据的时候,大家注意小王将一直处于阻塞状态,直到小李把这个数据更新完成之后,然后小王才可以继续来获取这个锁,来对我们已经更新之后的150,然后来进行一个减30的操作,所以说当我们使用了悲观锁之后,我们可我们是可以正常的来实现最终的一个功能的。好,那什么叫做乐?
03:00
观锁呢,大家注意,那乐观锁呢,就是比较乐观,那乐观锁是什么意思,大家来看,比如说我们现在同样是小李和小王啊,因为他们两个同时操作,所以说小李获取的最最初的价格大家说是多少啊,是不是应该是100啊,那小王获获取的最初的价格是不是也是100,那咱们的乐观所一般都通过什么实现,大家注意一般都是通过咱们的一个版本号,在我们的表里面来设置一个字段,叫做版本号来实现的,比如说咱们当前每一这这个关于这个商品的数据,对吧?它最初的版本号是一。OK,大家来看,那这个时候啊,然后我们所获取的这个数据最初的价格是不是100啊,我们所获取的这个版本号最初是不是也是,是不是应该都是一对不对,好,那每当我的一个用户来对这个数据进行了一个更新的操作之后,然后他既会将我们当前的价格更新,也会将我们当前的一个什么版本号进行更新,比如说咱们每一次更新之后,把原有的版本号加一,那所以说大家来看这是最初的数据,那小李加上了50之后,咱们当前的数据就变成了150,然后版本号为二,那小王在操作的时候,大家注意他获取的是不是应该也是100和一啊。
04:24
那他在更新的时候,他怎么更新的呢?大家注意,他除了要来更新这个数据之外,他还要把我们最初所获得的版本号来作为条件,然后进行匹配,那所以说现在的版本号已经发生了变化,那小王在进行操作的时候,大家想他还能匹配到这条数据,然后来进行修改吗?就不能了,所以说大家一定要注意,当我们加上了版本号之后,我们以后每一次的修改操作都要先查询查询当前这个数据,然后以及它所对应的版本号,我们每一次的更新也都有了,有也都多了一个条件,就是我们当前的版本号,我们每一次更新的时候,除了除了要来匹配我们要操作的数据之外,我们还要以我们最初所获得的版本号为条件,那只要是在我们操作之前,它的版本号发生了变化,也就是说已经有用户来对这个数据进行了更新,那我们再进行操作。
05:25
错的时候,小王在进行操作的时候,操作的时候,那他一定是操作不成功的,因为版本号已经发生变化了啊,这个大家注意好,那就像是我们的笔记里面给大家写的这个大家往下看一下啊,乐观所实现的流程一样,对吧?我们只需要在数据库的表中啊,然后添加一个version字段,咱们在取出记录的时候来获取这个version,大家看一下好,然后我们在进行更新的时候呢,然后我们也是要把咱们之前获取的这个version来作为条件的,大家注意,如果我们当前,比如说咱们在这儿获取的version它是一,那我们在进行更新的时候,我们就要把version等于一来作为条件来进行更新,那如果在我进行更新之前,已经有用户对这条数据进行了操作,那它的版本号将会发生变化,那大家说下面咱们的这条SQL语句还会执行吗?
06:21
还能够匹配到相对应的数据来进行修改吗?就不会了,这个大家注意啊,好OK,那这个就是我们的乐观锁和悲观所的一个简单的介绍,那下面呢,那我们就来模拟一下咱们刚才所说的这个场景的一个冲突问题。
我来说两句