You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL执行DELETE语句遇#1205锁等待超时错误的排查求助

别慌,我来帮你拆解这个InnoDB锁等待超时的问题,一步步来解决它~

先明确你的问题场景

你执行这条DELETE语句时触发了#1205 - Lock wait timeout exceeded; try restarting transaction错误:

DELETE FROM `hotspot_sentences` WHERE doc_id = 459

你已经做了初步排查:show open tables WHERE In_use > 0返回空结果,同时提供了SHOW FULL PROCESSLIST的结果截图。

可能的原因与解决方案

1. 排查InnoDB行级锁的持有情况

show open tables只能检查表级锁的使用情况,但InnoDB用的是行级锁,所以这个结果无法反映行锁状态。你需要查询InnoDB的锁相关系统表来定位问题:

-- 查看当前所有的锁
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-- 查看锁等待关系
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
-- 查看所有活跃事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

这些查询能帮你找到哪个事务在持有目标行的锁,以及当前等待锁的事务详情,是定位问题的核心步骤。

2. 清理长时间运行或未提交的事务

从你的SHOW FULL PROCESSLIST截图里(通常这类问题中),大概率存在长时间处于Sleep状态的事务,或者执行时间过长未完成的事务。这些事务会一直持有锁不释放,导致后续操作超时。

  • 找到这些事务的Id(进程ID),确认它们不是正在运行的关键业务后,用KILL命令终止:
KILL [进程ID];

3. 优化DELETE语句的性能,减少锁持有时间

如果hotspot_sentences表数据量大,或者doc_id字段没有索引,DELETE会扫描全表,不仅慢,还会持有锁更久:

  • 先检查doc_id是否有索引:
SHOW INDEX FROM `hotspot_sentences`;
  • 如果没有索引,赶紧给doc_id创建索引(这能大幅提升DELETE的执行速度,减少锁时间):
CREATE INDEX idx_hotspot_sentences_doc_id ON `hotspot_sentences`(doc_id);
  • 如果要删除的行数很多,分批删除,避免一次性持有大量行锁:
DELETE FROM `hotspot_sentences` WHERE doc_id = 459 LIMIT 1000;

重复执行这条语句,直到所有符合条件的行都被删除。

4. 调整锁等待超时参数(治标方案)

如果你的业务场景确实需要更长的锁等待时间,可以临时调整innodb_lock_wait_timeout参数(默认50秒):

SET GLOBAL innodb_lock_wait_timeout = 120; -- 临时生效,MySQL重启后失效

如果需要永久生效,修改MySQL配置文件(my.cnf/my.ini):

innodb_lock_wait_timeout = 120

然后重启MySQL服务。注意:这只是临时缓解,建议先找到锁的根源再调整。

5. 排查是否有其他冲突操作

确认是否有其他事务在对hotspot_sentences表执行UPDATE、INSERT或者SELECT ... FOR UPDATE这类会持有行锁的操作。通过INNODB_TRX表可以查看活跃事务的SQL语句(如果有的话),从而定位冲突的操作。


内容的提问来源于stack exchange,提问作者Shahneel Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:01:25