侧边栏壁纸
博主头像
zcarry博主等级

BUG,永无止境

  • 累计撰写 13 篇文章
  • 累计创建 28 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

MySql Delete Insert 死锁

zcarry
2022-08-19 / 0 评论 / 1 点赞 / 10,941 阅读 / 301 字 / 正在检测是否收录...

MySql 并发下 先删除再插入 死锁

还原场景,以下场景 id 1, 2 都不存在

T1 T2
begin; begin;
delete from table where id =1; 【步骤1,影响行数为0】 delete from table where id =2;【步骤2,阻塞等待】
insert into table value 1 ;【步骤3,影响行数1】 insert into table value 1; 【步骤4,此时步骤2的 阻塞结束,并返回死锁】
commit; commit;

结论

  1. delete的where子句没有满足条件的记录,而对于不存在的记录 并且在RR级别下,delete加锁类型为gap lock,gap lock之间是兼容的
  2. insert时,其加锁过程为先在插入间隙上获取插入意向锁,插入数据后再获取插入行上的排它锁。又插入意向锁与gap lock和 Next-key lock冲突,即一个事务想要获取插入意向锁,如果有其他事务已经加了gap lock或 Next-key lock,则会阻塞。
  3. 场景中两个事务都持有gap lock,然后又申请插入意向锁,此时都被阻塞,循环等待造成死锁。
1

评论区