首页/数据/数据库速查/锁等待与死锁的 SQL 级分析
SQL 语法52 条

锁等待与死锁的 SQL 级分析

用 sys.innodb_lock_waits 找到阻塞链,用 performance_schema.data_locks 看锁位点,最后用固定顺序 + 短事务根治。

数据库速查数据更新于 2026-10-12
用途锁与死锁分析
视图sys.innodb_lock_waits / performance_schema.data_locks
参数innodb_lock_wait_timeout=50s

阻塞链定位

阻塞链定位
SELECT waiting_pid, waiting_query, blocking_pid, blocking_query, wait_age
FROM sys.innodb_lock_waits\G

SELECT * FROM performance_schema.data_locks LIMIT 20;
SELECT * FROM performance_schema.data_lock_waits LIMIT 20;
死锁不会无限等(InnoDB 主动检测并回滚代价小的一方),应用要有重试;锁等待超时才是必须干预的信号。

易错点

  • 找到阻塞方后先看它的完整 SQL 与开启时间,再决定 KILL 还是等它提交
  • 同一事务内对不同表/行的加锁顺序要固定,否则并发下死锁几乎必然出现

数据来源与参考

  • MySQL 8.0 Reference Manual: The sys Schema - innodb_lock_waits

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌