最近在通过极客时间的专栏,MySQL45讲复习mysql,看完了锁的部分,结合原来看到《Mysql是怎样运行的书》,做了一些小总结
1 MySQL加锁规则
这里我们提到的加锁规则都是在隔离级别为可重复读的情况,具体规则如下:
-
我们加锁的最基本的单位都是next-key lock,是对一个左开右闭的区间进行加锁
这里注意next-key lock可以认为是一个复合锁,是record lock 和gap lock结合起来的锁;前者就是我们所说的记录锁,是加载在我们的行记录上面的,后者就是我们常说的间隙锁,是一个开区间(next-key lock是以最右边的记录为边界,所以这里也能够说明为啥锁住的是一个左开右闭的区间了)
-
只有扫描到的记录才会加锁
无论什么时候,都要明确一点,我们的锁是加在索引(这里也能看到反应了在innodb中索引即数据,数据即索引的特点)上的,我们在查记录的时候都是查询优化器选择好索引后在对应的索引上进行查询,这个时候我们在查询过程中扫描到的记录才可能会加锁
-
对于唯一索引,在做等值查询的时候,next-key lock会退化成record-lock
这也很好理解,唯一索引等值查询查询到的值必然只有一个,所以mysql在此处做了优化
-
对于普通索引的等值查询,在扫描的第一个不符合条件的记录时,next-key lock退化成gap lock
我们在扫描的时候根据索引的特点,扫描到不符合条件的记录时就会结束ÿ