首先通过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或调整事务边界来缓解问题。