MySQL如何查询当前事务和锁等待?常用SQL排查方法
2026-10-29 5 0
MySQL 运行过程中,如果出现 SQL 执行缓慢、更新语句长时间卡住或接口请求超时,可能与事务未提交、行锁冲突或锁等待有关。通过查询当前事务和锁等待信息,可以快速找到被阻塞的 SQL 以及持有锁的事务。
查看当前正在执行的 SQL
最简单的方法是使用 SHOW PROCESSLIST:
SHOW FULL PROCESSLIST;
重点关注 Id、User、Time、State 和 Info 字段。Time 表示当前线程处于相应状态的时间,Info 显示正在执行的 SQL。
如果发现线程长时间处于 Waiting for ... lock 等状态,可以进一步检查事务和锁信息。需要注意,执行中的 SQL 不一定就是持有锁的 SQL,空闲连接也可能仍然保留未提交事务。
查询当前 InnoDB 事务
MySQL 可以通过 INFORMATION_SCHEMA.INNODB_TRX 查看当前 InnoDB 事务:
SELECT
trx_id,
trx_state,
trx_started,
trx_wait_started,
trx_mysql_thread_id,
trx_rows_locked,
trx_rows_modified,
trx_query
FROM information_schema.innodb_trx
ORDER BY trx_started;
其中,trx_state 表示事务状态,trx_started 是事务开始时间,trx_wait_started 是开始等待锁的时间,trx_mysql_thread_id 可以关联连接线程 ID。
如果事务运行时间很长,或者状态为 LOCK WAIT,就需要进一步分析。trx_query 为空并不代表事务没有问题,应用可能已经执行完 SQL,却一直没有提交事务。
查询锁等待关系
MySQL 8.0 推荐使用 Performance Schema 中的 data_lock_waits 和 data_locks 查看锁等待关系。下面的 SQL 可以同时显示等待方和阻塞方:
SELECT
w.REQUESTING_ENGINE_TRANSACTION_ID AS waiting_trx,
r.OBJECT_SCHEMA,
r.OBJECT_NAME,
r.INDEX_NAME,
r.LOCK_TYPE AS waiting_lock_type,
r.LOCK_MODE AS waiting_lock_mode,
b.ENGINE_TRANSACTION_ID AS blocking_trx,
b.LOCK_MODE AS blocking_lock_mode
FROM performance_schema.data_lock_waits w
JOIN performance_schema.data_locks r
ON w.REQUESTING_ENGINE_LOCK_ID = r.ENGINE_LOCK_ID
JOIN performance_schema.data_locks b
ON w.BLOCKING_ENGINE_LOCK_ID = b.ENGINE_LOCK_ID;
查询结果可以帮助判断哪个事务正在等待锁、哪个事务持有冲突的锁,以及涉及哪张表和索引。若需要查看具体 SQL,可以再关联 INNODB_TRX,并结合线程信息排查阻塞方当前执行的语句。
使用 sys.innodb_lock_waits 快速定位
如果 MySQL 已提供并启用相应的 sys 视图,可以直接查询:
SELECT *
FROM sys.innodb_lock_waits;
该视图整合了锁等待双方的事务、线程和相关 SQL 信息,适合日常故障排查。若结果为空,说明查询时没有捕获到相关锁等待,但不能据此排除间歇性锁冲突。
如何处理长时间锁等待
找到阻塞事务后,应先检查对应连接、事务开始时间和业务操作,确认它是否因异常流程而未提交。常见原因包括事务中执行耗时操作、应用忘记提交或回滚,以及多个事务按照不同顺序更新相同行。
确认原因后,优先让业务正常提交或回滚事务。确实需要终止连接时,可以使用 KILL connection_id,但操作前必须确认连接归属和业务影响。终止连接可能触发事务回滚,造成额外负载。
排查锁等待时,还应留意索引是否合理、事务范围是否过大,以及相关 SQL 是否扫描了过多记录。将事务控制在较短时间内,并保持一致的更新顺序,通常能减少锁冲突。
日常维护 MySQL 时,建议同时掌握 SHOW FULL PROCESSLIST、INNODB_TRX 和 sys.innodb_lock_waits。出现数据库阻塞时,先找到等待方,再追踪阻塞方,通常比直接终止连接更安全,也更容易定位根本原因。