为了省 CPU 把 innodb_deadlock_detect 设成 OFF,结果并发扣库存时不再报 1213,请求全部卡满 50 秒才抛 Lock wait timeout。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,死锁检测关掉以后,数据库不再主动找环,两个事务互相等就只能等到超时。原来的 1213 是检测器发现环后立刻回滚一个事务,现在这条路径没了。并发越高,堆积越明显。

碰到「死锁检测关闭」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

SHOW VARIABLES LIKE 'innodb_deadlock_detect';
SET GLOBAL innodb_deadlock_detect = ON;
SHOW ENGINE INNODB STATUS\G

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

具体做法是,确认是不是有人为了降 CPU 关掉了检测;并发冲突不高的库保持开启 它只在真有环时才回滚;确实要关 就给业务加固定加锁顺序 从源头避免环;把超时时间调短 让坏请求尽快释放连接。

最后用这个标准收尾,并发扣减时重新出现 1213 并快速回滚 请求耗时从 50 秒回到几十毫秒。

作者 9823189