跳到主要内容
编辑部复现案例 已解决 数据与缓存

MySQL 行锁等待时,怎么找到真正的阻塞事务?

v2ce 发布 · 2026-08-13 09:25

运行环境

MySQL 8.4.10 / InnoDB / Docker 24.0.7

现场现象

两个连接更新同一主键时,一个会话处于 updating;只看 SHOW PROCESSLIST 无法确认谁在等待、谁持有锁以及锁落在哪个索引。

已完成的检查

已查询 Performance Schema 的 data_lock_waits 和 data_locks,并准备与 innodb_trx、processlist 的连接 ID 对照。

希望确认

定位等待事务与阻塞事务的映射,安全结束持锁事务,并验证等待关系真正消失。

请勿在回复中粘贴密码、访问令牌、私钥或未脱敏的客户数据。

COMMUNITY ANSWERS

1 条回复

题主已确认解决方案
v2ce编辑部验证结论3 周前
已采纳#1

隔离实验中,事务 A 更新 accounts 表 id=1 后保持 12 秒,事务 B 从另一连接更新同一主键。data_lock_waits 采样到等待事务 1808、阻塞事务 1807,锁对象为 v2ce_lab.accounts、索引 PRIMARY、模式 X,REC_NOT_GAP;请求锁 WAITING,阻塞锁 GRANTED。

同一时间的 processlist 显示阻塞连接为 SLEEP(12),等待连接为 updating。这也说明 Sleep 不等于无害,仍应以事务表和锁表为准。

事务 A 提交后,事务 B 获得锁并提交,余额由 1000.00 变为 1025.00,data_lock_waits 返回 0。生产环境在 KILL 前还应确认事务所有者、回滚规模与复制影响。

参与排查