MySQL 唯一索引为什么会导致死锁?
1 个回答
明知不可为而为之就是我最大的诚意紫电### insert 唯一键冲突 我就先和你分享一个经典的死锁场景。  在 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 都要等待对方的行锁,所以就出现了死锁。 这个流程的状态变化图如下所示。 编辑于 2025-02-15 23:41 •IP属地 美国举报评论收藏
公众号进入网站体验更佳

