直接看日志就能定位死锁根因,关键在于理解InnoDB死锁日志结构:以LATEST DETECTED DEADLOCK开头,对比两个事务的HOLDS和WAITING FOR锁信息,结合SQL语句还原执行路径,末尾明确回滚事务,据此统一访问顺序、缩短事务、调整隔离级别。
直接看日志就能定位死锁根因,关键不是“有没有日志”,而是“怎么看懂每一段在说什么”。InnoDB死锁日志结构固定、信息密集,掌握几个核心字段和逻辑关系,5分钟内就能理清谁锁了谁、为什么卡住。
死锁日志一定以LATEST DETECTED DEADLOCK开头,这是整段日志的锚点。它后面紧跟着时间戳(如 2025-12-23 10:22:18),代表死锁被InnoDB检测到的确切时刻。这个时间要和业务异常时间比对——如果应用报“Lock wait timeout”却没对应死锁日志,大概率是锁等待超时而非死锁。
日志中会明确标出 *** (1) TRANSACTION 和 *** (2) TRANSACTION。重点对比两处:
每个事务块里都有一行 query id xxx, SQL thread yyy, query zzz,直接给出引发死锁的具体语句,例如:
delete from orders where user_id = 123 and status = 'pending'
注意两点:
InnoDB总选一个事务回滚,日志末尾会写明:
*** WE ROL
L BACK TRANSACTION (2)
被回滚的事务通常是 undo log 更小、修改行数更少的那个。但这不是优化目标——真正要改的是: