Next-Key锁是索引记录上的记录锁和索引记录之前间隙上的间隙锁的组合。

InnoDB执行行级锁定的方式是,当它搜索或扫描表索引时,它会对遇到的索引记录设置共享或独占锁。因此,行级锁实际上是索引记录锁。索引记录上的下一个键锁定也会影响该索引记录之前的“间隙”。也就是说,Next-Key锁是索引记录锁加上索引记录之前间隙上的间隙锁。如果一个会话对索引中的记录R具有共享或独占锁定,则另一个会话无法在索引顺序中R之前的间隙中插入新的索引记录。

假设一个索引包含值10、11、13和20。此索引可能的Next-Key锁覆盖以下区间,其中圆括号表示排除区间端点,方括号表示包含端点:

(负无穷, 10]

(10, 11]

(11, 13]

(13, 20]

(20, 正无穷)

对于最后一个间隔,Next-Key锁定索引中最大值上方的间隙,以及值高于索引中实际任何值的“上确界”伪记录。上确界不是真正的索引记录,因此,实际上,Next-Key锁只锁定最大索引值后面的间隙。

默认情况下,InnoDB在REPEATABLE READ事务隔离级别下运行。在这种情况下,InnoDB使用Next-Key锁进行搜索和索引扫描,从而防止出现幻影行。

Next-Key锁的事务数据在SHOW ENGINE INNODB STATUS和INNODB监视器输出中显示如下:

RECORD LOCKS space id 58 page no 3 n bits 72 index PRIMARY of table test.t trx id 10080 lock_mode X Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0 0: len 8; hex 73757072656d756d; asc supremum;; Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 4; hex 8000000a; asc ;; 1: len 6; hex 00000000274f; asc 'O;; 2: len 7; hex b60000019d0110; asc ;;


©著作权归作者所有:来自51CTO博客作者wx650278adcb120的原创作品,请联系作者获取转载授权,否则将追究法律责任 InnoDB存储引擎使用的锁类型 https://blog.51cto.com/u_16262406/10118361