锁等待超时参数是什么
innodb_lock_wait_timeout 决定事务等待行锁多久后放弃,默认 50 秒,超时报 1205 并把当前语句回滚。它只影响行锁等待,不影响死锁检测。参数调小能让阻塞更快暴露给应用,调大只是让请求堆得更久,不会解决根因。
基本信息
| 适用 | MySQL 5.7 / 8.0,仅 InnoDB 行锁等待生效 |
|---|---|
| 默认值 | 50 秒 |
| 作用域 | GLOBAL 与 SESSION 均可设置,连接池需注意会话值差异 |
| 配套 | innodb_deadlock_detect 负责死锁检测,与超时是两套机制 |
查看与调整
查看与调整
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'; # 当前生效值
SET GLOBAL innodb_lock_wait_timeout = 20; # 新连接生效
SET SESSION innodb_lock_wait_timeout = 10; # 仅本会话,OLTP 短超时常用
-- 报错示例:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
SELECT * FROM sys.innodb_lock_waits; # 超时后确认阻塞源
SHOW VARIABLES LIKE 'innodb_deadlock_detect'; # 死锁检测是否开启超时值与业务的关系
| 取值 | 表现 | 适用 |
|---|---|---|
| 1-5 秒 | 快速失败,应用需具备重试能力 | 面向用户的在线写操作 |
| 10-20 秒 | 兼顾重试与体验的折中 | 通用 OLTP 会话级设置 |
| 50 秒(默认) | 用户请求早已超时,数据库线程仍在等 | 不建议用于在线接口 |
| 数百秒 | 错误变少但线程全堆在等待里 | 仅临时排障,不可长期使用 |
典型使用场景
- 接口超时排查:确认是锁等待超时而不是死锁或慢查询
- 给批量后台任务单独设置更长的会话级超时,避免误报失败
- 热点行争用严重时先调小超时暴露问题,再优化业务写入顺序
- 配合监控统计 1205 次数,作为并发争用的先行指标
- 升级或参数变更后核对连接池会话值,防止行为漂移
超时值应小于业务接口超时时间,让数据库先失败、应用再重试;反过来设置会让请求卡在数据库层直到网关超时,排查时看不到明确的数据库错误。
把超时调到几百秒来「消除报错」会让连接池耗尽:错误确实变少了,但线程都堵在等待里,故障面从个别接口扩大到整个实例。