innotop默认不显示事务锁详情,需按l进入innodb locks视图查等待/持有锁,再按t切换至transactions视图匹配trx_id分析阻塞链;死锁需结合shift+d摘要与show engine innodb status中的latest detected deadlock段验证。

直接启动 innotop 看不到事务锁详情,是因为它默认进入的是整体状态视图(Dashboard),不自动解析 SHOW ENGINE INNODB STATUS 中的锁和死锁信息。要实时监控等待中的事务锁与死锁细节,必须手动切换到对应视图并交叉比对。
进入锁视图查看实时等待关系
启动 innotop 后按 l(小写 L)进入 InnoDB Locks 视图,这里会列出:
- 所有当前被持有的锁(
lock_trx_id)和正在等待的锁(waiting_trx_id) - 锁模式(
lock_mode,如X、S、INSERT_INTENTION) - 锁类型(
lock_type,如RECORD行锁 或TABLE表锁) - 锁定的表名(
lock_table)和索引名(lock_index)
若某行的 waiting_trx_id 与另一行的 lock_trx_id 相同,说明该事务正被阻塞;结合 lock_trx_id 可定位到持有锁的源头事务。
切换到事务视图关联分析阻塞上下文
在锁视图中按 t 进入 InnoDB Transactions 视图,可查出每个事务的:
- 运行状态(
trx_state,如LOCK WAIT表示正在等锁) - 开始时间(
trx_started)和等待起始时间(trx_wait_started) - 正在执行的 SQL(
trx_query),即被卡住的具体语句 - 线程 ID(
trx_mysql_thread_id),可用于后续 kill 操作
将锁视图中的 waiting_trx_id 与事务视图中的 trx_id 匹配,就能确认哪条 SQL 在等哪把锁、等了多久、由谁持有。
识别死锁需结合日志与交互验证
innotop 本身不直接高亮死锁,但可通过以下方式快速发现:
- 在事务视图中查找多个事务同时处于
LOCK WAIT状态,且它们的trx_query明显互锁(例如 A 更新 id=1、B 更新 id=2,但 A 又要读 id=2、B 又要读 id=1) - 按 Shift+D 查看 InnoDB Status 摘要,其中
LATEST DETECTED DEADLOCK段落会完整打印最近一次死锁的两个事务、各自持有的锁、等待的锁、以及 InnoDB 选择回滚的事务 - 若看到某事务状态为
ROLLING BACK且trx_state是LOCK WAIT,大概率是刚被选为死锁牺牲者
辅助验证:用 SQL 补充 innotop 的盲区
innotop 是交互式工具,不替代 SQL 查询。建议搭配执行:
-
SELECT * FROM information_schema.innodb_lock_waits;—— 直接查出阻塞链路(含blocking_trx_id和requesting_trx_id) -
SELECT * FROM information_schema.innodb_trx WHERE trx_state = 'LOCK WAIT';—— 快速筛选所有等待事务 -
SHOW ENGINE INNODB STATUS\G—— 手动翻看完整死锁日志,尤其注意TRANSACTIONS和LATEST DETECTED DEADLOCK两段











