答案是通过SHOW PROCESSLIST和INNODB_TRX定位长事务,结合INNODB_LOCK_WAITS分析阻塞关系,找出锁等待源头并优化SQL或终止异常线程。

MySQL锁等待问题通常会导致查询变慢、连接堆积甚至服务不可用。排查这类问题需要从当前的锁状态、事务信息和正在执行的SQL入手,快速定位阻塞源头。以下是常用的排查方法。
使用 SHOW PROCESSLIST 查看当前所有连接的执行状态:
SHOW FULL PROCESSLIST;
重点关注 State 为 "Sending data"、"Locked" 或长时间处于同一状态的线程,以及对应的 SQL 语句。
更深入的信息可以通过 information_schema.INNODB_TRX 查看当前正在运行的事务:
SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started;
这个表能显示每个事务的开始时间、事务状态、持有的锁、正在执行的SQL等。长时间运行的事务很可能是造成锁等待的源头。
通过以下查询可以找出哪些事务被阻塞,以及是谁在阻塞它们:
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;
结果会列出“谁在等”和“被谁挡着”,是排查锁冲突的核心依据。
如果需要进一步分析锁类型和行级锁详情,可查询:
SELECT * FROM information_schema.INNODB_LOCKS;
注意:该表在某些MySQL版本中已被废弃,建议优先依赖 INNODB_LOCK_WAITS 和 INNODB_TRX。
基本上就这些。关键在于及时发现阻塞链,结合事务和SQL分析原因,再针对性处理。不复杂但容易忽略的是日常监控和索引维护。
以上就是mysql如何排查锁等待问题_mysql锁等待排查方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号