在前一篇文章我讲了下 MySQL 的全局锁、表记锁和行级别锁,其中行级锁只提了概念,并没有具体说。
因为行级锁加锁规则比较复杂,不同的场景,加锁的形式还不同,所以这次就来好好介绍下行级锁。
对记录加锁时,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的,next-key lock 是前开后闭区间,而间隙锁是前开后开区间。
但是,next-key lock 在一些场景下会退化成记录锁或间隙锁。
那到底是什么场景呢?今天,我们就以下面这个表来进行实验说明。
其中,id 是主键索引(唯一索引),b 是普通索引(非唯一索引),a 是普通的列。
注意,我的 MySQL 的版本是 8.0.26,不同版本的加锁规则可能是不同的。
唯一索引等值查询
当我们用唯一索引进行等值查询的时候,查询的记录存不存在,加锁的规则也会不同:
- 当查询的记录是存在的,在用「唯一索引进行等值查询」时,next-key