如何有效解决MySQL长时间运行未提交事务导致的锁表问题?

2026-04-27 17:481阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1060个文字,预计阅读时间需要5分钟。

如何有效解决MySQL长时间运行未提交事务导致的锁表问题?

确保在执行KILL CONNECTION命令之前,已确认`trx_state`为`RUNNING`且`trx_started`已过时。

只看 PROCESSLISTSTATE = '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 不代表安全,反而是高危信号。

阅读全文
标签:Mysql

本文共计1060个文字,预计阅读时间需要5分钟。

如何有效解决MySQL长时间运行未提交事务导致的锁表问题?

确保在执行KILL CONNECTION命令之前,已确认`trx_state`为`RUNNING`且`trx_started`已过时。

只看 PROCESSLISTSTATE = '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 不代表安全,反而是高危信号。

阅读全文
标签:Mysql