通过查询information_schema.INNODB_TRX可查看活跃事务的ID、状态、开始时间及关联线程;结合SHOW PROCEsslIST和performance_schema.threads定位长事务会话;利用performance_schema.data_locks和data_lock_waits分析锁等待与阻塞关系;执行SHOW ENGINE INNODB STATUS获取事务与死锁详情,综合多表信息可有效监控mysql事务活动。

在 MySQL 中监控事务活动是数据库性能调优和故障排查的重要环节。通过观察当前正在运行的事务,可以发现长时间未提交的事务、锁等待问题以及潜在的死锁风险。以下是几种实用的方法来有效监控事务活动。
查看当前活跃事务
MySQL 提供了 information_schema.INNODB_TRX 表,用于展示当前每个线程中正在执行的 InnoDB 事务信息。
执行以下查询:
select trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query, trx_operation_state, trx_isolation_level FROM information_schema.INNODB_TRXG
关键字段说明:
- trx_id:事务唯一标识符
- trx_state:事务状态(如 RUNNING、LOCK WAIT)
- trx_started:事务开始时间,可用于判断长事务
- trx_mysql_thread_id:关联的线程 ID,可用于进一步追踪会话
- trx_query:当前正在执行的 SQL 语句
如果发现某个事务已运行数分钟甚至更久,应重点排查是否遗漏了 COMMIT 或 ROLLBACK。
结合进程列表分析事务会话
使用 SHOW PROCESSLIST 可查看当前所有连接的状态:
SHOW FULL PROCESSLIST;
关注 State 列为 “Locked” 或长时间处于非空闲状态的连接,并结合 INNODB_TRX 中的 trx_mysql_thread_id 进行比对,定位具体事务来源。
也可以从 performance_schema 中获取更详细的会话信息:
SELECT PROCESSLIST_ID, PROCESSLIST_USER, PROCESSLIST_HOST, PROCESSLIST_DB, PROCESSLIST_COMMAND, PROCESSLIST_TIME, PROCESSLIST_STATE FROM performance_schema.threads WHERE TYPE = ‘FOREGROUND’;
监控锁等待与阻塞关系
长时间事务常伴随锁竞争。可通过 INFORMATION_SCHEMA.INNODB_LOCKS 和 INNODB_LOCK_WAITS 查看锁情况(注意:MySQL 8.0 已移除这些表,建议使用 performance_schema)。
在 MySQL 8.0+ 中,使用:
SELECT * FROM performance_schema.data_locks;
查看阻塞情况:
SELECT waiting_trx_id, blocking_trx_id, waiting_pid, blocking_pid, wait_started FROM performance_schema.data_lock_waits;
结合 INNODB_TRX 表中的 trx_id 与 data_lock_waits 中的等待关系,可快速识别哪个事务被阻塞、谁是源头。
启用 InnoDB 状态输出辅助诊断
执行以下命令可获取 InnoDB 子系统的详细运行状态,包括事务、锁、缓冲池等:
SHOW ENGINE INNODB STATUSG
输出内容中 “TRANSACTIONS” 部分会列出当前活跃事务及其锁信息,“LATEST DETECTED DEADLOCK” 可帮助分析最近一次死锁原因。
建议定期查看或在出现问题时立即执行,作为补充诊断手段。
基本上就这些。掌握这些方法后,你可以快速定位长时间运行的事务、锁等待链和阻塞源头。关键是结合多个系统表交叉验证,形成完整的事务视图。不复杂但容易忽略细节,比如线程 ID 的对应关系和时间维度的判断。