运维把 innodb_lock_wait_timeout 从 50 改成 5,第二天订单接口 1205 Lock wait timeout exceeded 从每天 3 次涨到 400 次。日志里能对上时间点,这种反而好排。

超时时间缩短只是让等待更早失败,锁冲突本身一点没少。原本能等 30 秒排到的请求,现在 5 秒就被掐断,失败率自然上去。业务层没有重试,错误直接冒到用户。这一点先确认清楚,后面就不用反复试。

SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
SET GLOBAL innodb_lock_wait_timeout = 20;
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_waits';

「锁等待超时配置」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:先统计 1205 的分布 看集中在哪几条 SQL;给这几条 SQL 补索引或拆事务 减少持锁时间;业务层加带退避的重试 只对 1205 和 1213 生效;超时值按持锁时间 P99 设 不要凭感觉调。

结果对不对很好判断,1205 次数回落到个位数 Innodb_row_lock_waits 不再持续上涨 接口错误率恢复。

作者 9823189