MySQL 错误:超过锁定等待超时;尝试重新启动事务查询

Posted

技术标签:

【中文标题】MySQL 错误:超过锁定等待超时;尝试重新启动事务查询【英文标题】:MySQL Error: Lock wait timeout exceeded; try restarting transaction Query 【发布时间】:2014-09-05 04:31:49 【问题描述】:

我发现很多人从 mysql 收到相同的错误消息,错误状态相同=41000 和错误代码相同=1205。

但其中大多数涉及 2 个事务和一个死锁。

基于SHOW ENGINE INNODB STATUS的输出,只有1笔交易:

====================================== 140715 4:42:37 INNODB 监控输出 ====================================== 从过去 21 秒计算的每秒平均值 ---------- 信号量 ---------- OS WAIT ARRAY INFO:保留计数 1630,信号计数 1612 互斥体自旋等待 0,回合 10461,操作系统等待 205 RW 共享旋转 2051,操作系统等待 1024; RW-excl 旋转 407,操作系统等待 380 ------------ 交易 ------------ Trx id 计数器 0 8450727 清除已完成 trx 的 n:o = 0 8450726 的 trx,看到
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;
+-----------------------+-----------------+------------------------+
| @@GLOBAL.tx_isolation | @@tx_isolation  | @@session.tx_isolation |
+-----------------------+-----------------+------------------------+
| REPEATABLE-READ       | REPEATABLE-READ | REPEATABLE-READ        |
+-----------------------+-----------------+------------------------+
1 row in set (0.00 sec)

如果我将自动提交设置为 true(我使用的是 Apache Common DBCP 1.4)建立连接,则不存在此问题。

【问题讨论】:

【参考方案1】:

我发现了问题。

问题在于 MySQL 期望同一事务中的所有查询都在同一 TCP 连接中完成,而通过 QueryRunner 执行的每个 SQL 都可能会启动到数据库的新 TCP 连接(尽管它可以通过多种方式进行控制)。

【讨论】:

以上是关于MySQL 错误:超过锁定等待超时;尝试重新启动事务查询的主要内容,如果未能解决你的问题,请参考以下文章

超过锁定等待超时;尝试重新启动事务 MYSQL Python

使用 C# 在 Mysql 上死锁 - “超过锁定等待超时;尝试重新启动事务”

超过锁定等待超时;尝试重新启动交易[关闭]

收到警告:SQL 错误:1205,SQLState:41000 错误:超过锁定等待超时;尝试重新启动事务。使用休眠保存记录

mysql_query("START TRANSACTION")- 超过锁定等待超时;尝试在 Codeigniter Mysql 中重新启动事务

保存/更新模型时,Django“超过锁定等待超时;尝试重新启动事务”