GreatSQL社区

搜索

[已解决] 死锁相关的问题

594 5 2024-7-30 11:29
为什么session1 rollback会产生死锁,而commit就不会呢?这种情况下rollback和commit对加锁有什么改变吗?
全部回复(5)
yejr 2024-7-30 12:09:37
可以先参考这个案例解析 https://mp.weixin.qq.com/s/8nRdTa0ruovAi8juL_H8yQ
李努力 2024-7-30 13:46:02
本帖最后由 李努力 于 2024-7-30 14:02 编辑

是不是因为这样:

① rollback情况:说明session1没有写入成功,记录不存在,session2和session3都获取了S next key lock,但是当获取record lock(X)的时候就会相互阻塞产生死锁
② commit情况:说明session1写入成功了,记录存在,这时session2和session3再写入的时候只会进行冲突检测也就是试图添加S next key lock,但是不会尝试获取record lock(X)(因为记录存在了,执行了 insert报错直接获取S next key lock),所以session2和session3都是S类型的锁也就没有所谓的锁冲突,所以不会产生死锁。
这样理解对吗?
yejr 2024-7-30 14:05:11
李努力 发表于 2024-7-30 13:46
是不是因为这样:

① rollback情况:说明session1没有写入成功,记录不存在,session2和session3都获取了 ...

嗯,是滴
李努力 2024-7-30 14:23:29

老师,那insert ... on duplicate key ...这种碰到主键或者唯一键冲突添加的是record lock(X)还是X next key lock呢?
yejr 2024-8-1 10:18:09
李努力 发表于 2024-7-30 14:23
老师,那insert ... on duplicate key ...这种碰到主键或者唯一键冲突添加的是record lock(X)还是X next  ...

插入前的唯一性冲突检测,都是先申请 next-key s lock,参考文档解释

If a duplicate-key error occurs, a shared lock on the duplicate index record is set. This use of a shared lock can result in deadlock should there be multiple sessions trying to insert the same row if another session already has an exclusive lock. This can occur if another session deletes the row.
李努力

4

主题

7

博客

190

贡献

中级会员

Rank: 3Rank: 3

积分
223

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

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-10-31 16:27 , Processed in 0.020426 second(s), 16 queries , Redis On.
快速回复 返回顶部 返回列表