• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

MySQL InnoDB锁信息阅读

MySQL InnoDB 彭东稳 7年前 (2017-10-25) 28754次浏览 已收录 1个评论

下面主要分析一下 InnoDB 加锁的详细信息,主要用于分析一条语句的详细加锁结构以及加了什么锁。

记得先打开 InnoDB monitor 中的锁详细信息输出,只在 MySQL 下有用,在 MariaDB 下不起作用。

然后创建一个模拟表:

RR隔离级别+普通索引

主要看一下这个语句的加锁信息。

执行 show engine innodb status 命令得到锁信息,如下:

可以看到,在 RR 隔离级别下,next-key 锁是分为 gap锁+记录锁 分别添加的。在我们这个例子中,加锁规则是 (1,3]、(3,6),也就是说不光是对执行操作的记录本身 (b=3) 加了 锁,同时还对 (1,3)、(3,6) 这个区间加锁。所以在上面的情况下,在其他会话中进行如下操作以及对应的结果为:

INSERT INTO fd SELECT 4,2;

执行不成功,因为索引b的 (1,3]、(3,6) 这个区间被锁)

INSERT INTO fd SELECT 6,5;

执行不成功,因为索引b的 (1,3]、(3,6) 这个区间被锁)

INSERT INTO fd SELECT 8,6;

执行成功,因为主键值8比主键值7大,所以落在 (7,6) 记录后面,无锁)

INSERT INTO fd SELECT 6,7;

执行成功,因为主键只锁了id=5这条记录,而b列的0也不在 (1,3]、(3,6) 锁范围内)

INSERT INTO fd SELECT 6,6;

(–执行不成功,因为主键6比主键7小,所以 (6,6) 这条记录需要插在 (7,6) 记录前,被索引b的 (1,3]、(3,6) 这个区间锁了

进制转换

从锁信息中可以看到,字段信息都是十六进制的,所以就牵扯到转换为列对应的各种数据类型。

十六进制转十进制

十六进制转字符串

十六进制转日期

十六进制转日期这个转换比较。

实际的数值是 fc72b ;前 3 位 是年数 x 2 转换 16 进制,第 4 位是月数 x 2 转换 16 进制,超过 15 向上进位;第 5 位是 天,超过 15 向上进位; 因此 fc72b -> fc6 – 12 – b -> 4038 / 2 – 18 / 2 – 11 -> 2019 – 9 – 11。

<延伸>

【MySQL】如何阅读死锁日志


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (5)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽