必须查 INFORMATION_SCHEMA.INNODB_TRX 才能准确定位持锁事务,因 SHOW PROCESSLIST 仅反映连接层状态;配合 INNODB_LOCK_WAITS 可厘清阻塞链,且应优先 KILL CONNECTION 以彻底回滚事务释放锁。

查 INFORMATION_SCHEMA.INNODB_TRX 才能揪出真凶
只看 SHOW PROCESSLIST 会漏掉真正持锁的事务——它显示的是连接层状态,而阻塞来自事务层。一个 Command = 'Sleep'、Time = 3600 的连接,如果对应事务仍处于 TRX_STATE = 'RUNNING',那它大概率刚执行完 BEGIN 就挂起了,锁还牢牢占着。
必须查这张表:
SELECT
trx_id,
trx_mysql_thread_id,
trx_state,
trx_started,
trx_rows_locked,
trx_wait_started,
trx_query
FROM INFORMATION_SCHEMA.INNODB_TRX
WHERE trx_state IN ('RUNNING', 'LOCK WAIT')
AND TIMESTAMPDIFF(SECOND, trx_started, NOW()) > 5;
-
TRX_STARTED是事务开始时间,不是连接建立时间;用TIMESTAMPDIFF算真实秒数才准 -
TRX_WAIT_STARTED比TRX_STARTED更关键:如果它不为空,说明事务已进入锁等待,哪怕只等了 1 秒也得优先处理 -
TRX_ROWS_LOCKED > 1000或TRX_WAITING_TRX_ID IS NOT NULL是强阻塞信号,别犹豫 -
TRX_QUERY经常为空——事务可能只执行了BEGIN,或 SQL 已执行完但没提交
用 INNODB_LOCK_WAITS 看清谁在等谁
单看一个事务看不出锁链关系。当多个事务嵌套等待时,必须靠 INNODB_LOCK_WAITS 把因果链拉出来:
SELECT t1.trx_id AS waiting_trx_id, t1.trx_mysql_thread_id AS waiting_thread, t2.trx_id AS blocking_trx_id, t2.trx_mysql_thread_id AS blocking_thread, t2.trx_query AS blocking_query FROM INFORMATION_SCHEMA.INNODB_TRX t1 INNER JOIN INFORMATION_SCHEMA.INNODB_LOCK_WAITS w ON t1.trx_id = w.BLOCKING_TRX_ID INNER JOIN INFORMATION_SCHEMA.INNODB_TRX t2 ON w.BLOCKING_TRX_ID = t2.trx_id;
- 结果里
blocking_thread才是该杀的对象;杀waiting_thread没用,锁还在 - 如果查不到结果,可能是锁已释放,或是死锁被 InnoDB 自动回滚了(此时去查
SHOW ENGINE INNODB STATUS\G里的LATEST DETECTED DEADLOCK) - 注意:
t2.trx_query也可能为空,这时得结合performance_schema.events_statements_history查最近执行语句
KILL CONNECTION 而不是 KILL QUERY
面对长事务阻塞,几乎总是该用 KILL CONNECTION。因为:
-
KILL QUERY只中断当前语句,不回滚事务——如果事务已执行过UPDATE但没COMMIT,锁依然挂着 -
KILL CONNECTION强制关闭连接,InnoDB 会立即回滚整个事务,释放所有行锁、间隙锁和内存资源 - 例外情况极少:仅当你确认连接活跃、只跑一个慢
SELECT、且应用能安全重试时,才考虑KILL QUERY - 执行后检查
INFORMATION_SCHEMA.INNODB_TRX是否消失,别信SHOW PROCESSLIST里状态变Killed就算完事
别忘了权限和云环境限制
本地 MySQL 和云数据库(如阿里云 RDS、腾讯云 CDB)行为差异很大:
- 云数据库通常屏蔽
SHOW PROCESSLIST全量视图,但INFORMATION_SCHEMA.INNODB_TRX一般仍可查(需PROCESS+SELECT权限) - 某些云平台要求用控制台“终止会话”,而非直接执行
KILL命令;命令行返回成功不代表实际生效 - 若无
SUPER或CONNECTION_ADMIN权限,KILL可能报错Access denied; you need (at least one of) the SUPER or CONNECTION_ADMIN privilege(s) - 应用用了连接池(如 HikariCP),
TRX_MYSQL_THREAD_ID和PROCESSLIST.ID可能不一致,必须以INNODB_TRX.TRX_MYSQL_THREAD_ID为准
最易被忽略的一点:事务是否真正结束,不能只看 KILL 返回成功,必须再查一遍 INNODB_TRX 确认记录消失——有些云环境存在延迟或代理层拦截。


















