next-key locks nextkey lock 间隙锁 到底是什么?

next-key locks nextkey lock 间隙锁 到底是什么?,第1张

父文章: mysql 原理探究
官方定义

Next-Key Locks

A next-key lock is a combination of a record lock on the index record and a gap lock on the gap before the index record.

MySQL :: MySQL 5.7 Reference Manual :: 14.7.1 InnoDB Locking
但是实际例子和官方描述不符合.

  MySQL :: About Next-Key Locks 和  InnoDB Next-Key Lock浅析 - 知乎 互相佐证一个问题, 

以下所有的 *** 作都是在Read Repeatable级别下进行测试,测试版本是MySQL官方5.7.21版本

新建一张表:

CREATE TABLE `test` ( 
`id` int(11) primary key auto_increment, 
`xid` int, KEY `xid` (`xid`) ) 
ENGINE=InnoDB DEFAULT CHARSET=utf8; 
insert into test(xid) values (1), (3), (5), (8), (11);

注意,这里xid上是有索引的,因为该算法总是会去锁住索引记录。

现在,该索引可能被锁住的范围如下:

(-∞, 1], (1, 3], (3, 5], (5, 8], (8, 11], (11, +∞)

根据下面的方式开启事务执行SQL:

Session A执行后会锁住的范围:

(5, 8], (8, 11)  ( phil注 原文有误, 注意并不会锁住11.  能gap锁先gap锁)

除了锁住8所在的范围,还会锁住下一个范围,所谓Next-Key。

这样,Session B执行到第六步values(5)会阻塞(phil注,这个很难理解,见截图中@Pramy解析,记住mysql的锁是基于page里的行的,排序是index+primary,详见下面bilibli视频解析),跳过第六步不执行,第七步values(9)也会阻塞,但是并不阻塞第八步values(11),第九步values(12)也不阻塞。

上面的结果似乎并不符合预期,因为11这个值看起来就是在(8, 11]区间里,而5这个值并不在(5, 8]这个区间里。

 data_locks 查看
select * from performance_schema.data_locks

MySQL next-key lock 加锁范围是什么? - SegmentFault 思否

真真要搞懂原理,看这个源代码解析

【Mysql原理与实践】第2阶段第11讲Next-key Lock加锁源码分析_哔哩哔哩_bilibili

1小时55秒  开始讲 锁类型概念
1小时02分10秒 开始讲 全局锁的结构体
1小时12分48秒 开始讲最核心的锁结构体
1小时14分19秒 开始讲typeMode字段, 对应的概念是 锁类型 ,值有next-key等. 看明白了
后面讲bitMap(妙)来记录哪些行拥有这种类型锁.  行锁以page为单位进行管理,lock_t-->lock_rec_t-->n_bits,到bitmap位图查询某行是否有行锁; bitmap的读是通过位与的,即可得到哪几行拥有了这个锁.
 
看到这个,我终于悟道了一点, 即本质上来说, mysql最核心依据行来进行加锁, 且将这个锁的类型延伸出几种类型. 最终基于这个加锁能力, 实现了可重复读下避免幻读的能力.
 也很好的解释了,  MySQL :: About Next-Key Locks 和  InnoDB Next-Key Lock浅析 - 这两个里提出的疑惑.  

附录

其他可以一看的文章

 疑惑?实战演示疑惑 mysql insert到底加什么锁_个人渣记录仅为自己搜索用的博客-CSDN博客

其他知识点 

  mysql 内存页解析_个人渣记录仅为自己搜索用的博客-CSDN博客

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/886474.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存