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