首先通过查询information_schema.innodb_lock_waits确定阻塞关系,再结合innodb_trx和performance_schema.data_locks分析事务状态与锁类型,最后用SHOW ENGINE INNODB STATUS查看详细锁信息,定位并处理长时间运行或未提交的事务,优化SQL和索引使用。

在 MySQL 中分析事务锁等待情况,主要通过查看系统表和状态信息来定位阻塞源头。核心手段包括使用 information_schema 和 performance_schema 库中的相关表,以及启用 InnoDB 的监控功能。
查看当前锁等待和阻塞关系
通过以下查询可以获取当前正在等待锁的事务及其被谁阻塞:
1. 查询锁等待信息(MySQL 5.7+):
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_queryFROM information_schema.innodb_lock_waits wJOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_idJOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;
结果会显示等待事务和阻塞事务的线程 ID、执行语句等,便于快速定位问题 SQL。
查看当前事务和锁信息
进一步分析每个事务持有的锁和运行状态:
1. 查看所有正在运行的事务:
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query, trx_operation_state, trx_tables_in_use, trx_isolation_levelFROM information_schema.innodb_trx ORDER BY trx_started;
重点关注长时间运行的事务(trx_started 较早),这类事务容易造成锁堆积。
大师兄智慧家政
58到家打造的AI智能营销工具
99 查看详情
2. 查看 InnoDB 锁信息(需开启 performance_schema):
SELECT * FROM performance_schema.data_locks WHERE OBJECT_SCHEMA = 'your_database_name';
该表展示每一行或索引上的具体锁类型(如 RECORD LOCK、GAP LOCK),帮助判断是行锁还是间隙锁导致等待。
启用 InnoDB 状态监控
通过查看 InnoDB 的详细运行状态,获取更深层的锁信息:
SHOW ENGINE INNODB STATUSG
输出内容中关注以下几个部分:
TRANSACTIONS:列出当前所有事务,包含是否在等待锁。LOCK WAIT:如果有事务在等待,会显示等待的锁和持有者。SEMAPHORES:若出现大量“os_waits”,可能意味着严重锁竞争。
这个命令提供的是快照信息,建议结合其他查询一起使用。
常见处理建议
识别长时间未提交的事务,及时 kill 对应线程(KILL [thread_id])。检查是否存在未使用索引的更新/删除操作,这类操作容易升级为表锁。优化事务逻辑,减少事务持有锁的时间,避免在事务中做耗时操作。设置合理的锁等待超时时间:innodb_lock_wait_timeout(默认50秒)。
基本上就这些方法,关键是结合锁等待视图、事务状态和实际业务 SQL 综合判断。
以上就是如何在mysql中分析事务锁等待情况的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1076202.html
微信扫一扫
支付宝扫一扫