应用偶发死锁报错,重试就好了,但一直不知道原因。

排查:
show engine innodb status 里的 LATEST DETECTED DEADLOCK 段。里面会写两个事务分别持有什么锁、在等什么锁。

看的方法:找到两个事务加锁的表和索引,对比顺序。如果 A 先锁 x 再锁 y,B 先锁 y 再锁 x,就是顺序问题。

解法:统一加锁顺序。比如所有事务都按 id 升序处理。

我这次的原因是批量更新时 ID 列表顺序不固定。改成排序后再更新,死锁消失。

经验:死锁不一定是代码错,可能是顺序不一致。统一顺序比加重试更彻底。

主楼