MySQL 死锁排查记:两个事务互相等待——InnoDB 行锁与间隙锁的真相
引言 大促彩排当晚,秒杀压测到 3000 并发时,下单接口开始批量报错,日志里刷屏的是同一句话: Deadlock found when trying to get lock; try restarting transaction DBA 的第一反应是“死锁了,MySQL 会自动回滚一个,重启事务就行”——问题是这个死锁每秒都在发生:被回滚的那一半请求里,一部分重试成功,一部分又撞进下一轮死锁,订单创建成功率从 100% 跌到 62%,压测被迫中断。 更蹊跷的是业务视角的死锁描述:两个事务根本“没有”操作同一行——事务 A 更新的是 SKU 1001 的库存,事务 B 更新的是 SKU 2002 的库存,它们凭什么互相等待?带着这个“不相干的行为什么会死锁”的疑问,我们拉开了一次教科书级的 InnoDB 锁排查:SHOW ENGINE INNODB STATUS 的死锁日志 → lock_mode X locks gap 字样 → 真相是间隙锁。这篇文章完整还原排查过程,并附上死锁日志的逐行解读技巧。 一、30 秒补课:InnoDB 的锁到底有几种 看懂死锁日志的前提是分清锁类型。....