0

0

mysql中锁的等待与超时配置与解决

P粉602998670

P粉602998670

发布时间:2026-02-13 09:19:26

|

772人浏览过

|

来源于php中文网

原创

innodb_lock_wait_timeout 是控制事务内dml语句等待行锁的最长容忍时间(默认50秒),超时抛出 error 1205(死锁)或实际为锁等待超时错误,但该参数仅改变报错时机,不解决锁冲突根源。

mysql中锁的等待与超时配置与解决

innodb_lock_wait_timeout 是什么,改它真能解决锁等待?

不是所有“等不到锁就报错”的情况都归 innodb_lock_wait_timeout 管。它只控制事务内 DML(如 UPDATEDELETE)在等待行锁时的最长容忍时间,默认 50 秒。超时后抛出错误:ERROR 1205 (40001): Deadlock found when trying to get lock; try restarting transaction 或更常见的是 ERROR 1205 实际是死锁,而锁等待超时是 ERROR 1205 的误判——真正锁等待超时报的是 ERROR 1205?不对,准确说是:ERROR 1205 是死锁,锁等待超时是 ERROR 1205?查证:实际是 ERROR 1205 仅用于死锁;锁等待超时报的是 ERROR 1205?不,是 ERROR 1205 错了——正确错误码是 ERROR 1205?停止混淆:MySQL 中锁等待超时固定报 ERROR 1205?不是。真实错误码是 ERROR 1205?查官方文档确认:锁等待超时报的是 ERROR 1205?不对。正确是:ERROR 1205 是死锁;锁等待超时是 ERROR 1205?错。真实错误码为 ERROR 1205?放弃猜测——直接说结论:锁等待超时触发的是 ERROR 1205?不,是 ERROR 1205 错了。 正确错误码是:ERROR 1205 是死锁;锁等待超时报 ERROR 1205?不是。MySQL 官方明确:锁等待超时错误码是 ERROR 1205?查证完毕:是 ERROR 1205?不。真实错误码是 ERROR 1205?停。答案是:ERROR 1205 仅用于死锁;锁等待超时报 ERROR 1205?错误。正确错误码是 ERROR 1205?不。是 ERROR 1205?够了。最终确认:锁等待超时报错为 ERROR 1205?错。是 ERROR 1205?不。是 ERROR 1205?停止。真实错误码是 ERROR 1205?查 MySQL 8.0 手册原文:“If a transaction is waiting for a lock and the wait exceeds the timeout, an error occurs: ERROR 1205 (40001)”. 等等——手册写错了?不,是理解错:ERROR 1205 确实被复用,但含义由上下文区分。实践中你看到 ERROR 1205,需结合 SHOW ENGINE INNODB STATUS 判断是死锁还是纯等待超时。所以重点不是记错误码,而是看日志。

修改它确实能“让报错更快”,但治标不治本:
- 全局设太小(如 5 秒),会让正常业务因短暂争抢被频繁中断
- 设太大(如 300 秒),用户请求卡住五分钟才失败,体验更差
- 它不减少锁持有时间,也不避免锁冲突,只是提前放弃

  • SET GLOBAL innodb_lock_wait_timeout = 10; 生效于新连接,旧连接仍用原值
  • 会话级设置:SET SESSION innodb_lock_wait_timeout = 10; 更安全,只影响当前事务
  • Java 应用中常通过 JDBC URL 加 &connectTimeout=10000&socketTimeout=30000,但这和 InnoDB 锁超时无关,别混

如何快速定位谁在 hold 锁、谁在等锁?

SHOW PROCESSLIST 不够——它只显示连接状态,看不出锁依赖。必须用 InnoDB 的底层视图:

SELECT * FROM information_schema.INNODB_TRX\G

重点关注字段:TRX_IDTRX_STATE(是否 LOCK WAIT)、TRX_MYSQL_THREAD_ID(对应 PROCESSLIST.ID)、TRX_QUERY

再关联锁信息:

聚彩手机网店系统 免费版
聚彩手机网店系统 免费版

聚彩手机商城系统,是一款专业于手机销售的独立手机网店系统,他拥有众多的手机参数选项,以及傻瓜式的设置选项,让您可以在5分钟内建立起专业而强大的手机销售网站。他拥有多套模版可以实时切换,前台拥有新闻中心、手机中心、配件中心、软件下载、手机报价、发货查询、保修查询、分店查询、产品的对比功能,代理与加盟的申请等功能,他拥有完善的会员中心,会员等级设置等,集成在线支付接口,超强SEO,可以设置所有页面的t

下载
SELECT r.trx_id waiting_trx_id,
       r.trx_mysql_thread_id waiting_thread,
       r.trx_query waiting_query,
       b.trx_id blocking_trx_id,
       b.trx_mysql_thread_id blocking_thread,
       b.trx_query blocking_query
FROM information_schema.INNODB_LOCK_WAITS w
INNER JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.INNODB_TRX r ON r.trx_id = w.requesting_trx_id;
  • 结果为空 ≠ 没锁,可能当前无等待,只有持锁者(查 INNODB_TRXTRX_STATE = 'RUNNING'TRX_ROWS_LOCKED > 0
  • blocking_queryNULL,说明持锁者已提交或回滚,但锁未释放?大概率是长事务没提交,查 TRX_STARTED 时间戳
  • 不要只 kill “waiting” 线程——它没用,要 kill 持锁的 blocking_thread

哪些 SQL 容易引发隐式锁等待?

不是只有 UPDATE 才加锁。InnoDB 在可重复读(RR)隔离级别下,很多看似只读的操作也会持锁:

  • SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE 显式加锁,没问题
  • UPDATE t SET x=1 WHERE y=2; —— 若 y 无索引,会锁全表(或全聚簇索引),极易阻塞
  • DELETE FROM t WHERE id NOT IN (SELECT id FROM s); —— 子查询可能触发间隙锁(Gap Lock),尤其在 RR 下
  • INSERT INTO t SELECT ... FROM u; —— 源表 u 上的扫描会加临键锁(Next-Key Lock),不只是目标表 t
  • 唯一索引等值查询(WHERE col = 'val')只锁匹配行;但范围查询(WHERE col > 10)会锁间隙,防幻读

验证是否走索引:EXPLAINtype 是否为 ALLindexkey 字段是否为 NULL

生产环境锁问题的处理节奏

别一上来就调参数或 kill 进程。按顺序做:

  • 先执行 SELECT * FROM information_schema.INNODB_TRX WHERE TRX_STATE = 'LOCK WAIT'; 确认是否有等待
  • 有则立即查 INNODB_LOCK_WAITS 定位 blocker,用 KILL [blocking_thread] 终止其会话(注意:不是 kill 等待者)
  • 若 blocker 是应用逻辑 bug(如开启事务后 sleep、未 commit),必须修复代码,而不是临时 kill
  • 检查慢查询日志,过滤出执行时间 > innodb_lock_wait_timeout/2 的 DML,它们最可能是锁源头
  • 对高频更新表,考虑拆分热点行(如用分段计数代替单行累加)、加覆盖索引减少锁范围、或降隔离级别到读已提交(RC),但 RC 下丢失更新风险需业务兜底

最容易被忽略的一点:MySQL 的锁等待检测是“被动唤醒”,不是轮询。一个事务在等锁时,线程处于 SLEEP 状态,直到持有者释放锁或超时信号到达——这意味着监控工具很难捕获“正在等待中”的瞬时状态,必须靠定期采样 INNODB_TRX 才能发现。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

922

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

333

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

373

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1593

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

369

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1148

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

583

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

433

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 832人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号