MySQL版本:8.0.29
测试表:
测试数据:
开始测试:
事务1执行
事务2执行
事务3执行
事务1回滚
事务3发生了死锁
死锁原因分析:
1)事务1首先insert,只有隐式锁;
2)事务2进行同样的insert,给事务1加上记录排他锁,自己加上next-key S lock,进入阻塞等待状态;
3)事务3进行同样的insert,自己加上next-key S lock,进入阻塞等待状态;
4)事务1回滚,事务2和事务3会同时获取到next-key S lock(间隙锁相互兼容),然后重新进行insert操作,发现需要插入记录的间隙存在间隙锁,然后生成一把插入意向锁,进入阻塞等待状态(等待对方的next-key S lock释放,从而死锁)
insert唯一索引死锁问题-2
最新推荐文章于 2024-01-15 16:12:53 发布
文章详细描述了一个在MySQL8.0.29版本中发生的死锁情况,涉及三个并发事务。事务1先执行插入操作,持有隐式锁;事务2随后尝试相同操作,对事务1加锁并等待;事务3同样尝试插入,导致三方都进入等待状态。当事务1回滚时,事务2和3同时继续,但由于插入意向锁和间隙锁的相互影响,形成死锁。
摘要由CSDN通过智能技术生成