如何在mysql中分析事务锁等待情况

P粉602998670
发布: 2025-11-07 13:26:02
原创
604人浏览过
首先通过查询information_schema.innodb_lock_waits确定阻塞关系,再结合innodb_trx和performance_schema.data_locks分析事务状态与锁类型,最后用SHOW ENGINE INNODB STATUS查看详细锁信息,定位并处理长时间运行或未提交的事务,优化SQL和索引使用。

如何在mysql中分析事务锁等待情况

在 MySQL 中分析事务锁等待情况,主要通过查看系统表和状态信息来定位阻塞源头。核心手段包括使用 information_schemaperformance_schema 库中的相关表,以及启用 InnoDB 的监控功能。

查看当前锁等待和阻塞关系

通过以下查询可以获取当前正在等待锁的事务及其被谁阻塞:

1. 查询锁等待信息(MySQL 5.7+):

<font face="Courier New,Courier,monospace">SELECT 
    r.trx_id AS waiting_trx_id,
    r.trx_mysql_thread_id AS waiting_thread,
    r.trx_query AS waiting_query,
    b.trx_id AS blocking_trx_id,
    b.trx_mysql_thread_id AS blocking_thread,
    b.trx_query AS blocking_query
FROM 
    information_schema.innodb_lock_waits w
JOIN 
    information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
JOIN 
    information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;</font>
登录后复制

结果会显示等待事务和阻塞事务的线程 ID、执行语句等,便于快速定位问题 SQL。

查看当前事务和锁信息

进一步分析每个事务持有的锁和运行状态:

1. 查看所有正在运行的事务:

<font face="Courier New,Courier,monospace">SELECT 
    trx_id, 
    trx_state, 
    trx_started, 
    trx_mysql_thread_id,
    trx_query,
    trx_operation_state,
    trx_tables_in_use,
    trx_isolation_level
FROM 
    information_schema.innodb_trx 
ORDER BY 
    trx_started;</font>
登录后复制

重点关注长时间运行的事务(trx_started 较早),这类事务容易造成锁堆积。

如知AI笔记
如知AI笔记

如知笔记——支持markdown的在线笔记,支持ai智能写作、AI搜索,支持DeepseekR1满血大模型

如知AI笔记 27
查看详情 如知AI笔记

2. 查看 InnoDB 锁信息(需开启 performance_schema):

<font face="Courier New,Courier,monospace">SELECT * 
FROM performance_schema.data_locks 
WHERE OBJECT_SCHEMA = 'your_database_name';</font>
登录后复制

该表展示每一行或索引上的具体锁类型(如 RECORD LOCK、GAP LOCK),帮助判断是行锁还是间隙锁导致等待。

启用 InnoDB 状态监控

通过查看 InnoDB 的详细运行状态,获取更深层的锁信息:

<font face="Courier New,Courier,monospace">SHOW ENGINE INNODB STATUS\G</font>
登录后复制

输出内容中关注以下几个部分:

  • TRANSACTIONS:列出当前所有事务,包含是否在等待锁。
  • LOCK WAIT:如果有事务在等待,会显示等待的锁和持有者。
  • SEMAPHORES:若出现大量“os_waits”,可能意味着严重锁竞争。

这个命令提供的是快照信息,建议结合其他查询一起使用。

常见处理建议

  • 识别长时间未提交的事务,及时 kill 对应线程(KILL [thread_id])。
  • 检查是否存在未使用索引的更新/删除操作,这类操作容易升级为表锁。
  • 优化事务逻辑,减少事务持有锁的时间,避免在事务中做耗时操作。
  • 设置合理的锁等待超时时间:innodb_lock_wait_timeout(默认50秒)。

基本上就这些方法,关键是结合锁等待视图、事务状态和实际业务 SQL 综合判断。

以上就是如何在mysql中分析事务锁等待情况的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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