首页/数据/SQL 速查/排查锁等待:谁在阻塞谁
变更与事务52 条

排查锁等待:谁在阻塞谁

线上出现锁等待时先找出持锁会话与等待链:MySQL 用 performance_schema.data_lock_waits,PostgreSQL 用 pg_locks 与 pg_blocking_pids。

SQL 速查数据更新于 2026-10-12

MySQL 8

MySQL 8
SELECT * FROM performance_schema.data_lock_waits\G

SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query
FROM information_schema.INNODB_TRX;

PostgreSQL

PostgreSQL
SELECT pid, wait_event_type, wait_event, state, query
FROM pg_stat_activity
WHERE wait_event_type = 'Lock';

-- 被谁阻塞
SELECT pid, pg_blocking_pids(pid) AS blocked_by, query
FROM pg_stat_activity
WHERE cardinality(pg_blocking_pids(pid)) > 0;
MySQLperformance_schema.data_locks / data_lock_waits 给出等待关系
PostgreSQLpg_blocking_pids(pid) 直接给出阻塞者
行动定位后 KILL 长事务或让应用回滚,而不是盲目重启数据库

易错点

  • 只看到“查询慢”就扩容:实际是锁等待导致的排队,先看 wait_event 再谈优化
  • 排查完记得处理根因(长事务/缺索引/未提交连接),否则锁问题会周期复发

数据来源与参考

  • MySQL 8.0 Reference Manual · Performance Schema Lock Tables
  • PostgreSQL Documentation · Monitoring Database Activity
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌