如何有效解决MySQL长时间运行未提交事务导致的锁表问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1060个文字,预计阅读时间需要5分钟。
确保在执行KILL CONNECTION命令之前,已确认`trx_state`为`RUNNING`且`trx_started`已过时。
只看 PROCESSLIST 的 STATE = 'Locked' 或 TIME > 300 容易误杀——很多慢查询刚执行完、语句已结束,INFO 为空,但事务仍开着,trx_state 却稳稳挂着 RUNNING。真正该盯的是 INNODB_TRX 表:TRX_STARTED 时间戳比当前时间早几分钟甚至几小时,且 TRX_STATE = 'RUNNING',这种才是“静默长事务”。
查法示例:
SELECT t.TRX_ID, t.TRX_MYSQL_THREAD_ID, t.TRX_STARTED, t.TRX_ROWS_MODIFIED, p.USER, p.HOST, p.DB, p.COMMAND, p.TIME, p.INFO FROM information_schema.INNODB_TRX t JOIN information_schema.PROCESSLIST p ON t.TRX_MYSQL_THREAD_ID = p.ID WHERE t.TRX_STATE = 'RUNNING' AND t.TRX_STARTED < NOW() - INTERVAL 30 SECOND;
注意:TRX_ROWS_MODIFIED > 0 说明它真改过数据,不是空事务;INFO IS NULL 不代表安全,反而是高危信号。
本文共计1060个文字,预计阅读时间需要5分钟。
确保在执行KILL CONNECTION命令之前,已确认`trx_state`为`RUNNING`且`trx_started`已过时。
只看 PROCESSLIST 的 STATE = 'Locked' 或 TIME > 300 容易误杀——很多慢查询刚执行完、语句已结束,INFO 为空,但事务仍开着,trx_state 却稳稳挂着 RUNNING。真正该盯的是 INNODB_TRX 表:TRX_STARTED 时间戳比当前时间早几分钟甚至几小时,且 TRX_STATE = 'RUNNING',这种才是“静默长事务”。
查法示例:
SELECT t.TRX_ID, t.TRX_MYSQL_THREAD_ID, t.TRX_STARTED, t.TRX_ROWS_MODIFIED, p.USER, p.HOST, p.DB, p.COMMAND, p.TIME, p.INFO FROM information_schema.INNODB_TRX t JOIN information_schema.PROCESSLIST p ON t.TRX_MYSQL_THREAD_ID = p.ID WHERE t.TRX_STATE = 'RUNNING' AND t.TRX_STARTED < NOW() - INTERVAL 30 SECOND;
注意:TRX_ROWS_MODIFIED > 0 说明它真改过数据,不是空事务;INFO IS NULL 不代表安全,反而是高危信号。

