
这是一个 MySQL 锁等待超时(Lock Wait Timeout) 错误,意思是当前事务尝试更新某行数据,但这行数据已被其他事务锁定,等待超过阈值后报错。
网上的原因大部分如下:
| 场景 | 说明 |
|---|---|
| 长事务未提交 | 某个事务UPDATE/SELECT FOR UPDATE后迟迟未COMMIT/ROLLBACK |
| 批量更新冲突 | 多个线程同时更新同一批配置 |
| 事务嵌套过深 | 方法上 @Transactional 嵌套,导致锁持有时间过长 |
| 慢SQL拖累 | 事务中前面有慢查询,导致后续UPDATE等待过久 |
| 定时任务并发 | XXL-JOB分片或重复调度导致多实例同时更新 |
通常的解决方案是
step1、登录 mysql 执行 SHOW PROCESSLIST;
step2、找到状态为 Waiting for table metadata lock 或 Waiting for table level lock 的进程,记录其 Id
step3、KILL 进程ID
但是!在这些排查解决操作之前,先看一下有没有在用navicat操作数据表,挨个检查打开的选项卡,看看有没有误触这里的"开始事务"(如果误触,会变成提交/回滚两个选项),选回滚即可解决,不一定是系统的问题(x
