首先通过 INNODB_LOCK_WaiTS 和 INNODB_TRX 表定位锁等待的事务及sql,再结合 SHOW ENGINE INNODB STATUS 分析锁详情,利用 Performance Schema 监控数据锁,最后检查慢查询和未提交事务以找出根源。

在 mysql 中,锁等待问题会直接影响 数据库 的并发 性能和响应速度。当多个事务竞争同一资源时,就可能发生锁等待甚至死锁。要有效分析和解决这类问题,需要结合系统表、日志信息以及 SQL 执行情况来综合判断。
查看当前锁等待状态
MySQL 提供了 information_schema 中的几张关键表用于排查锁问题:
- INNODB_TRX:显示当前正在运行的 InnoDB 事务,包括事务 ID、开始时间、持有的锁、等待状态等。
- INNODB_LOCKS(MySQL 5.7 及以前):展示当前存在的锁信息,如锁类型、锁模式、涉及的索引等。
- INNODB_LOCK_WAITS:描述哪些事务在等待哪些锁,包含请求方与持有方的事务 ID 关系。
常用查询语句:
select
r.trx_id AS waiting_trx_id,
r.trx_query AS waiting_query,
b.trx_id AS blocking_trx_id,
b.trx_query AS blocking_query,
t.sql_text AS blocking_sql_text
FROM information_schema.INNODB_LOCK_WAITS w
JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocking_trx_id
JOIN information_schema.INNODB_TRX r ON r.trx_id = w.requesting_trx_id
JOIN performance_schema.events_statements_current t ON t.thread_id = system_thread_id(b.trx_mysql_thread_id);
这条语句能查出谁在等待、谁在阻塞、执行的是什么 SQL,是定位锁问题的核心手段。
启用并分析 InnoDB 监控
MySQL 内置了 InnoDB 标准监控功能,可以输出详细的引擎运行状态:
CREATE ENGINE INNODB STATUS;
然后执行:
SHOW ENGINE INNODB STATUSG
输出内容分为多个部分,重点关注:
- TRANSACTIONS:列出当前所有事务及其锁信息。
- LOCK WAIT:如果 有锁 等待,这里会显示具体等待情况。
- SEMAPHORES:信号量信息,若频繁出现等待可能暗示锁争用严重。
该命令输出的信息非常详细,适合人工诊断复杂场景下的锁行为。
利用 Performance Schema 深入追踪
从 MySQL 5.6 起,Performance Schema 增强了对锁的监控能力。可通过以下配置开启相关采集:
- 确保 performance_schema 已启用。
- 打开 事件 采集:setup_consumers中启用
statements_digest、wait_events等。 - 通过 data_locks 和data_lock_waits表直接查看行级锁情况(MySQL 8.0+)。
例如查询当前数据锁:
SELECT * FROM performance_schema.data_locks WHERE OBJECT_SCHEMA = ‘your_db’;
检查慢查询与未提交事务
长时间运行或未及时提交的事务往往是锁等待的根源:
- 开启slow_query_log,分析执行时间长的 SQL。
- 使用
SHOW PROCEsslIST查看是否有长期处于Running状态的事务。 - 检查应用是否遗漏了
COMMIT或ROLLBACK操作。
一个简单的未提交事务可能导致后续大量操作被阻塞。
基本上就这些方法。通过组合使用系统表、InnoDB 状态和性能视图,可以清晰地看到锁的来源和等待链路,进而优化 SQL 或调整事务边界来缓解问题。