应用偶发死锁报错,重试就好了,但一直不知道原因。
排查:
show engine innodb status 里的 LATEST DETECTED DEADLOCK 段。里面会写两个事务分别持有什么锁、在等什么锁。看的方法:找到两个事务加锁的表和索引,对比顺序。如果 A 先锁 x 再锁 y,B 先锁 y 再锁 x,就是顺序问题。
解法:统一加锁顺序。比如所有事务都按 id 升序处理。
我这次的原因是批量更新时 ID 列表顺序不固定。改成排序后再更新,死锁消失。
经验:死锁不一定是代码错,可能是顺序不一致。统一顺序比加重试更彻底。
主楼- 暂无回复
继续逛逛