跨库事务死锁自动恢复:锁等待超时回滚失败?分布式死锁检测 + 智能重试机制!
朋友公司的订单系统连了两个库——订单库和库存库。一笔订单创建需要在订单库 INSERT、在库存库 UPDATE,同一个事务里跨两库操作。高峰期出现了死锁:事务 A 锁了订单表的行等库存表的锁,事务 B 锁了库存表的行等订单表的锁。两个事务互相等待,40 秒后被 MySQL 的 innodb_lock_wait_timeout 强杀。问题是强杀后抛出的异常只说了"锁等待超时",没说是谁锁了谁——运维排查不到哪个事务导致了死锁。 单库死锁 MySQL 自己能检测和回滚,跨库死锁 MySQL 管不了——因为在它看来就是两个独立的事务各等各的。今天聊聊怎么在应用层做跨库死锁检测,并配合智能重试自动恢复。 跨库死锁是怎么发生的 单库死锁 MySQL 的 InnoDB 引擎自己就能处理:检测到环 → 选一个代价最小的回滚。但跨两个库的时候,场景是这样的: 事务 A: 事务 B: BEGIN BEGIN UPDATE orders SET ... UPDATE inventory SET ... WHERE id=1001 WHERE sku='XYZ' (锁住订单库的行) (锁住库存库的行) ....