GreatSQL社区

搜索

[已解决] mysql死锁问题

1465 14 2022-8-24 15:45
表:
CREATE TABLE `u` (
  `id` int(11) NOT NULL,
  `name` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
有以下两个情况,第二个情况是name唯一列冲突会产生死锁,而第一种情况是主键冲突不会产生死锁,这是什么 原因呢?不应该都加next-key lock吗?


QQ图片20220824154456.jpg
全部回复(14)
李努力 2022-8-25 14:55:20
yejr 发表于 2022-8-25 14:42
原表中有哪些数据,也贴一下

表里面没有数据的。
李努力 2022-8-25 14:56:40
yejr 发表于 2022-8-25 14:42
原表中有哪些数据,也贴一下

RR隔离级别
李努力 2022-8-25 15:43:09
yejr 发表于 2022-8-25 15:21
直接分析案例2

是的,老师,我不理解的是第一个不会产生死锁的那个情况,(11,22)持有x锁(no gap),(11,33)应该在11主键上会有LOCK_ORDINARY | X锁,当(9,44)插入的时候遇到间隙锁会有插入意向锁产生也会等待,也会产生死锁才对呀,为什么主键上面就没有gap锁了呢?

我理解没错的话LOCK_ORDINARY | X锁 这个就是next key lock吧
李努力 2022-8-25 17:59:11
张旭峰 发表于 2022-8-25 17:13
(9,44)和 (11,33) 之间没有锁互斥 主键上面没有gap锁

为啥主键上没有呢?插入(11,33)的时候,等待应该会产生next key lock吧
李努力 2022-8-25 18:00:48
张旭峰 发表于 2022-8-25 16:40
叶老师这个死锁 还是发生在 pk 上的
S1 (11,22) 持有id name上的记录锁   ; S2(22,22) 执行的时候这个需 ...

(11到 supremum;之间的gap lock锁) 这里我理解的是name上的(-∞,22]这个next key lock,所以插入(33,10)的时候会死锁了。
李努力 2022-8-26 10:03:34
yejr 发表于 2022-8-26 09:25
分别造出锁、锁等待、死锁场景,然后分别观察锁的情况,会有助于加深理解 ...

多谢叶老师。只是比较疑惑,主键和唯一索引同样是唯一的,为什么主键上面就不会加next key lock呢
李努力 2022-8-26 10:42:30

多谢各位老师。
李努力

3

主题

7

博客

182

贡献

中级会员

Rank: 3Rank: 3

积分
212

2022年度博学人物2022年度求知人物2022年度妙笔生花2022年度活跃用户

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-5-19 02:58 , Processed in 0.019033 second(s), 17 queries , Redis On.
快速回复 返回顶部 返回列表