00:00
那接下来呢,我们就详细分析一下,那么这三个问题,那这三个问题呢,其实后面两个问题啊,都比较好理解,那我们就不再啰嗦了,但主要是看这个所范围问题。那么这个所犯问题啊,和咱们后续要用到的MYSQL闭关锁。哎,是相同的一个东西。那么MY思Q悲观锁它也有这个锁范围,好,那么我们这里呢,先隐一句啊,悲关所机制也可以解决并发性问题,它的玩法呢,就是select,然后呢,For for update这那个玩意。那我们呢,先不管它啊,总之呢,我们这里呢,先去讨论了所范围啊,那后续呢,在这个地方我们就不再去讨论所范围了。那么所范围啊,怎么回事呢?那你比如说呢,我们在数据库表里面,我现在有一有两条记录了,那我再去添加一条记录,我搞三条记录。啊,来一个1002这个商品。
01:02
那么这个商品呢,我也是在,比如说是深圳啊,深圳啊它有呢5000件库存。啊,那么三条记录,那当我去使用我们的这个SQL语句,一个SQL语句。来自更新数量的时候。那它是把某一条记录给我锁住了呢?还是把表给我锁住了呢?哎,这就是我们要讨论的所范围哈。它到底是表所呢,还是行迹所呢?是表级锁?表极锁还是行级锁,接下来呢,我们打开我的这个MYSQL客户端,那我这里呢,有两个MYSQL。啊,都已经连接上了。分别代表是A用户和B用户。那么在A用户里面,我们也执行减固定操作,那咱首先肯定要去开启事物。那ma呢,你只要没有进入事物的情况下,它都会有事物啊。
02:04
那这样呢,为了方便演示,那我们这边去手动开启失误。来执行更新操作,更新我们的库存表,把库存进行简易操作,这于我们之前写的那个介测那个CQ语句,那么然后呢,Will will product code等于1001 and countt大于等于一。好,这就我们之前那个思索语句是一模一样的啊,那么营养条数呢,是两条记录。那么也就是说咱们这两条记录,哎应该怎么样呢?在我事物提交之前,它应该被锁住。那我接下来在用户二里面,在用户B里面,我来去更新第三个库存。能不能给你成功的。如果能够去更新的话,能够写的话,那说明第三个季度没有被锁住。
03:01
那么他只锁了这两条记录啊。如果第三条记录不能写,不能更新,那就说明呢,它是一个表题锁,第三条记录呢,也被锁住了。好,那我们来进行下看看啊,来一个update。DB stock set count等于count减一,那么VID等于三,我就直接根据ID的更新了。那我回车怎么样?被阻塞住了。被阻塞住了。那么一旦我这里事物结束所释放掉,那咱们这边的话呢,也就可以执行成功了。来我在一这个客户端里面。来一个roll back或者说呢,Commit都可以啊,那么只要事物结束了,那么咱这边呢,就会立马放行,也已经执行成功了。你之前并没有这两句话啊。好,那么由此可见。它应该是一个表级锁。
04:01
那为了验证这个表级锁呢,咱可以再来一次啊,我们再来开启这样的一个。事务,然后执行咱们军心操作。然后我来一个新增去试一下,比如我来一个insert insert into。然后我向DB talk这张表里面来新增一个记录啊,Values。然来新增四个最好记录。那我们的商品编号,我可以来个1002这个商品编号。那么仓库呢,我可以随便写一个啊,比如说这是上海上海仓。那么库存数量我依然是5000件库存。那我这个思路语句呢,啊,也已经写好了。那么下好之后呢,只要这张表没有锁住,那我这个新增操作呢,应该是可以完成的,那我一会说怎么样呢,被锁住了。啊,只要我这边事务结束,那这边新增立马是可以执行成功的,你现在呢,在这里卡着呢。
05:04
那在这里呢,来一个roll bag或者来一个啊。卡已经提交了,一旦提交,那么这边事物,这边的事情就可以结束了。就可以执行下去了,应该阻塞了17秒哈。那么来自刷新数据库,我们可以看到咱第四条记录呢,已经出现了1002,这个商品在上海仓也有5000件库存。那么由此可见,那么其实我们之前那个一个词汇语句那个东西啊,虽然看上去很简单,但是一种表级所。把整张库存表都给锁住了。那这是无法忍受的啊。因为将来呀,我们可能同时有很多人来去买不同商品,然后要进行减库存,结果你把整张表都给锁住了,那整张表都不能并发了。那性能呢,肯定是不行的。那怎么样呢,最好呢,使用航地锁。
06:00
哎,我只要把对应的梯度啊给锁住就可以了,那么怎么在我们的这个里面使用行极锁呢。好,那我们呢,就得要有讲究了啊。好,怎么使用行离索?那我们来可以分析一下啊,我们希望呢,在咱的MY思QMY思Q悲观锁中,那么使用行极锁啊行极锁,那使用行极锁怎么才能使用行极锁。那首先。你的更新条件或者说呢。咱的查询条件,那总之的话呢,就是你那个锁的条件啊。所得查询或者更新更新条件。必须。是索引字段啊,必须是索引字段,那你比如说呢,我们现在是根据谁的塔平等的。是根据我们的product code来查询更新的。
07:03
那我们就要对product code来创建索引。那他回到这个表里面去,那才可以呢,去设计表啊。在升级表的时候呢,来这里呢,有索引这个玩意儿,咱们可以新建一个索引,那对针对哪一列呢?针对考大家的扣的这一列可以新建索引。那么索引类型呢,咱就来一个normal,然后呢,呃,名字呀,咱给起个名字啊,IDX,然后呢,PC就product code这个意思啊。然后咱去保存一下。那么现在呢,我的这一列啊,这一列就有索引了。那么有了索引之后,发生什么变化了呢?好,那我们呢,再来演示一下,咱可以呢,在一这个用户里面,我再次开启这个事物。开启失误之后呀,我们还是去执行更新这个操作,哎,已经执行更新了。注意现在我都是4999件了啊啊,这个呢,是4998件的减了两次。
08:01
啊,那我这里呢,由于没有更新啊,没有没有没有提交事务。那么这个更新效果呢,应该还没有显示出来,对吧?OK,那么咱现在呢,回到第二个客户端,在第二个客户端里面,那执行更新三这条记录,更新这条记录。那么一这个用户他只锁水呢,只锁10011001啊对吧,1001这个库存信息啊,这两条库存信息。他不应该锁这两条库存记记。不应该走这两条。那我现在是根据ID3来进行更新的。那么他应该可以更新成功啊。好来,我们回到客户端二里面去,来执行这个更新操作,你立马可以更新成功了。那么此时呀,我们的深圳仓它是多少件库存呢?四千九百九十九十七件。那说明呢,他确实没有受到影响。那么此时呀,它就是一个行级锁。啊注意啊,这是第一个啊,首先呢,你的条件查询或者更新条件必须是索引字段,比如这个闭关所就上呢,就是查询条件了,这后面是个差询来啊这三个点这个地方是个差评。
09:13
那么然后呢,啊,第二个一定要注意,那么它是索引字段就一定会走索引吗?一定只是一个恒定索吗?也不一定。你的查询或者更新条件,更新条件必须是具体具体值。如果你不是一个具体值,它也是一个表底所啊。那我们呢,也来去演示一下。啊,当然这个索引啊,啊,也可以是五一键索引,也可以是主键索引,当然只要有索引字段就可以了啊。那么第二个的话呢,我们必须是具体值,那比如说呢,我现在是1001,这就是一个具体值。那假如我不是一个具体值的,咱先把这个事物呢,来结束啊,来一个roll back给它回滚回去,那么这个锁呢,应该也就释放掉了,来来去开启我们的。
10:08
事物开启事务之后呢,我来以执行更新操作,比如说这个地方不是一个具体值。哎,大家可能是啥呢?可能是一个like,能是一个like,那后面呢,我可能来一个什么啊,幺零,嗯,100,或者说我这个前面来一个啊。来一个摆平号,来一个这个摆平号吧,对吧,啊摆平号。So,某啥屏吗?它以零幺或者是001结尾的。所有数据。那么此时呢?它也是一种表接所。或者说呢,你不是一个like,或者你可能是这样子的,我可能是好像是不等于某一个值。哎,它也上的也是一种表结数,比如说我来一个不等于1002的,那不等于1002的不就是100001了吗?那我只有这两类数据啊。
11:03
那就是这两条记录。对吧,就这两条记录。那么现在我来去执行它会怎么样也影响基督书呢?依然是两条。哎,好像跟那个上面这个最后语句表面上看起来很像。有点类似,但是实际效果是不一样的啊。那么此时呢,我再去更新在客户端二里面,那就更新三这条记录,那么。如果正常情况下,他应该锁这条这两条记录啊,不会锁它,那现在还会不会锁第三条记录呢。拉雷执行更新操作,怎么样,又被锁住了?哎,所以呢,咱们的,呃,如果要使用行极锁的话啊,我们的条件,咱们的条件。必须是具体值,不能是那一刻,不等于这些东西。那么你可以是等于。那么K呢,是in啊这些东西。咱都可以,必须得是具体值。
12:01
哎,不能模糊的认为,哎,我不等于,那不等于多着呢,对吧,啊,那那一刻那也很多呢。那你搞不清楚了,所以如果以后我们要使用行级别的微管锁,那么一定要满足这两个条件。那么查询或者更新条件必须是索引字段,那么可以是主键索引,也可以是违键索引,也可以是普通的一个索引。那比如说刚才呢,我们就是以普通索引为例来演示的。那么然后呢,我们的更新条件必须是具体值。
我来说两句