应通过INNODB_TRX与INNODB_LOCK_WAITS联查定位阻塞者和被阻塞者,重点检查blocking_query及trx_state='ACTIVE'的幽灵事务,再用KILL thread_id回滚并释放锁,而非仅调大innodb_lock_wait_timeout。

查阻塞源:用 INNODB_TRX + INNODB_LOCK_WAITS 联查
锁等待超时不是“等不到锁”,而是“卡在别人手里”。先确认谁在占着不放,别靠 SHOW PROCESSLIST 猜——它看不到锁关系,只显示连接状态。
执行这条联查语句,直接定位到阻塞者和被阻塞者:
SELECT r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM information_schema.INNODB_TRX r
INNER JOIN information_schema.INNODB_LOCK_WAITS w ON w.requesting_trx_id = r.trx_id
INNER JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocking_trx_id;- 如果返回空,说明锁已释放或当前无活跃等待
- 重点看
blocking_query字段:是不是一个没提交的UPDATE、长时间SELECT FOR UPDATE,或者状态为Sleep但trx_state仍是ACTIVE的幽灵事务 -
trx_started时间比当前时间早几分钟以上,基本可判定是问题源头
KILL 线程:用 KILL [thread_id] 终止阻塞事务
找到 blocking_thread 后,直接杀掉对应线程。这不是断开连接,而是让 MySQL 主动回滚该事务并释放所有锁。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 执行
KILL 12345(把12345替换为查到的blocking_thread值) - 不要用
KILL CONNECTION 12345,除非你真要干掉整个客户端会话 - 调试阶段可用
KILL QUERY 12345中断当前语句但不终结事务,但生产环境慎用——它可能留下未提交的锁 - 杀完立刻再跑一遍联查,确认
INNODB_LOCK_WAITS为空,且原blocking_trx_id不再出现在INNODB_TRX中
别漏掉 Sleep 状态的 ACTIVE 事务
最常踩的坑是:PROCESSLIST 里看到线程状态是 Sleep,就以为它没事了。其实只要 INNODB_TRX.trx_state = 'ACTIVE',它就还在持锁——只是应用端没发新命令,事务却没 COMMIT 或 ROLLBACK。
- 这类事务往往来自代码里忘了关事务、异常后没回滚、或用了连接池但没正确管理生命周期
- 查法:
SELECT * FROM information_schema.INNODB_TRX WHERE trx_state = 'ACTIVE' AND trx_operation_state IS NULL; - 配合
PROCESSLIST查INFO字段为空、TIME很大的记录,基本就是它 - 这种事务 KILL 后不会丢数据,因为 MySQL 会自动回滚未提交变更
为什么不能只调大 innodb_lock_wait_timeout
改 innodb_lock_wait_timeout 是把报错延后,不是把锁解开。设成 300 秒,用户就要多等五分钟才失败;设成 5 秒,正常争抢也可能被误杀。
- 这个参数只控制“等多久放弃”,不影响锁持有时间、不减少锁冲突、也不修复索引缺失或长事务
- 线上建议保持默认 50 秒,搭配监控告警——超时频发本身就是一个明确信号:有事务设计或 SQL 问题需要处理
- 真正要动的配置是
innodb_rollback_on_timeout(默认 ON),确保超时后能干净回滚,避免半截事务残留
解除阻塞只是应急动作,背后那个没提交的事务、没走索引的 UPDATE、混在事务里的 HTTP 调用,才是下次超时的伏笔。

















