首页/数据/数据库速查/innodb_lock_wait_timeout 与 1205 错误
性能与调优57 条

innodb_lock_wait_timeout 与 1205 错误

行锁等待超时参数:等待超过 innodb_lock_wait_timeout(默认 50s)报 1205 并回滚语句(非事务);调小能让失败更快暴露,调大不会解决根因。

数据库速查数据更新于 2026-10-13

锁等待超时参数是什么

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 次数,作为并发争用的先行指标
  • 升级或参数变更后核对连接池会话值,防止行为漂移
超时值应小于业务接口超时时间,让数据库先失败、应用再重试;反过来设置会让请求卡在数据库层直到网关超时,排查时看不到明确的数据库错误。
把超时调到几百秒来「消除报错」会让连接池耗尽:错误确实变少了,但线程都堵在等待里,故障面从个别接口扩大到整个实例。

易错点

  • 调大超时值来消除 1205:根因是长事务或热点争用,调大只会把问题从报错变成整体变慢
  • 只改 GLOBAL 忽略会话缓存:连接池里的老连接仍用旧值,行为不一致且难以复现
  • 把 1205 与 1213 混为一谈:1205 是等待超时、1213 是死锁回滚,处置方式完全不同
  • 超时值大于接口超时:用户侧先断开,数据库仍在无效等待,浪费连接与线程资源

数据来源与参考

  • MySQL 8.0 Reference Manual: innodb_lock_wait_timeout

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌