注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

MySQL InnoDB锁信息阅读

MySQL InnoDB 彭东稳 5849次浏览 已收录 1个评论

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

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

然后创建一个模拟表:

RR隔离级别+普通索引

# 事务A

# 事务B

可以看到,不光是对执行操作的记录本身 (b=3) 加了x锁,同时还对 ((5,3),(7,6)) 这个区间加锁,实际上还会对区间 ((3,1),(5,3)) 进行加锁。所以在上面的情况下,在其他会话中进行如下操作以及对应的结果为:

INSERT INTO fd SELECT 4,2;

执行不成功,因为((3,1),(5,3))这个区间被锁)

INSERT INTO fd SELECT 6,5;

执行不成功,因为((5,3),(7,6))这个区间被锁)

INSERT INTO fd SELECT 8,6;

执行成功)

INSERT INTO fd SELECT 2,0;

执行成功)

INSERT INTO fd SELECT 6,7;

执行成功)

INSERT INTO fd SELECT 6,6;

(–执行不成功,因为 ((5,3),(7,6)) 这个区间被锁了。而 (6,6) 这个值正好落在这个区间内)

PS:看上例中gap锁所锁定的范围,是跟主键锁定一起使用的。所以一个表在没有主键的情况下,只有辅助索引也是没有用的。

<延伸>

【MySQL】如何阅读死锁日志


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

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

(1)个小伙伴在吐槽