GreatSQL社区

搜索

[已解决] mysql死锁问题

2535 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)
yejr 2022-8-25 14:42:33
原表中有哪些数据,也贴一下
李努力 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隔离级别
yejr 2022-8-25 15:21:52
直接分析案例2
session1session2
T0begin;begin;
T1insert into u select 11,22;

持有id=11上的 LOCK_REC_NOT_GAP | X

持有name=22上的LOCK_REC_NOT_GAP | X
T2insert into u select 22,22;

持有id=22上的 LOCK_REC_NOT_GAP | X锁
等待name=22上的 LOCK_ORDINARY | X锁
被阻塞
T3insert into u select 33.10;

请求name=22上的LOCK_INSERT_INTENTION|X,和session2冲突,所以把session2给回滚了


实际上这个死锁是发生在name这个uk上,所以上面这个案例,你可以把id列的值换成其他的,就更好理解些了。
案例1可以参考上面的分析过程,自行解读下。
李努力 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 16:40:15
yejr 发表于 2022-8-25 15:21
直接分析案例2

叶老师这个死锁 还是发生在 pk 上的
S1 (11,22) 持有id name上的记录锁   ; S2(22,22) 执行的时候这个需要等待name上的记录锁,同时(22,22)获取到 (11到 supremum;之间的gap lock锁)

S1 (33,10) 执行的时候 需要往(11到 supremum之间插入)这个时候 有一个意向插入锁 和 (11到 supremum;之间的gap lock锁)之间冲突 ,
这里锁等待产生环路导致了死锁发生 ;我做了下这个案例是把您说的session1 回滚了
张旭峰 2022-8-25 17:13:24
李努力 发表于 2022-8-25 15:43
是的,老师,我不理解的是第一个不会产生死锁的那个情况,(11,22)持有x锁(no gap),(11,33)应该在11 ...

(9,44)和 (11,33) 之间没有锁互斥 主键上面没有gap锁
李努力 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)的时候会死锁了。
12下一页
李努力

4

主题

7

博客

190

贡献

中级会员

Rank: 3Rank: 3

积分
223

2022年度博学人物2022年度求知人物2022年度妙笔生花2022年度活跃用户助人为乐(铜)

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

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