mysql插入会导致死锁吗?

1 个回答

  • 李后才
    醉后不知天在水,满船清梦压星河。
    ### insert 唯一键冲突 我就先和你分享一个经典的死锁场景。 ![image.png](https://images.codewd.com/fb51e2efe52f2f6226dcdea803fc2b9c.jpg "image.png") 在 session A 执行 rollback 语句回滚的时候,session C 几乎同时发现死锁并返回。这个死锁产生的逻辑是这样的: 在 T1 时刻,启动 session A,并执行 insert 语句,此时在索引 c 的 c=5 上加了记录锁。注意,这个索引是唯一索引,因此退化为记录锁。 在 T2 时刻,session B 要执行相同的 insert 语句,发现了唯一键冲突,加上读锁;同样地,session C 也在索引 c 上,c=5 这一个记录上,加了读锁。 T3 时刻,session A 回滚。这时候,session B 和 session C 都试图继续执行插入操作,都要加上写锁。两个 session 都要等待对方的行锁,所以就出现了死锁。 这个流程的状态变化图如下所示。 ![image.png](https://images.codewd.com/334c1b654cbc033d62a77e71684704fc.jpg "image.png") ### 如何避免? 1 关于insert造成死锁的情况,我之前做过测试,事务1并非只有insert,delete和update都可能造成死锁问题,核心还是插入唯一值冲突导致的.我们线上的处理办法是 1 去掉唯一值检测 2减少重复值的插入 3降低并发线程数量
    编辑于 2025-03-04 21:14 •IP属地 美国
    举报
    评论
    收藏