我正在运行以下MySQL UPDATE语句:
mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
我没有使用事务,为什么会得到这个错误?我甚至尝试重新启动我的MySQL服务器,它没有帮助。
该表有406,733行。
我正在运行以下MySQL UPDATE语句:
mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
我没有使用事务,为什么会得到这个错误?我甚至尝试重新启动我的MySQL服务器,它没有帮助。
该表有406,733行。
当前回答
我们昨天遇到了这个问题,在仔细研究了这里的每一个建议的解决方案,以及其他答案/论坛的其他几个解决方案后,我们最终在意识到实际问题时解决了它。
由于一些糟糕的计划,我们的数据库存储在一个挂载的卷上,该卷也接收我们的常规自动备份。该容量已达到最大容量。
一旦我们清理了一些空间并重新启动,这个错误就被解决了。
注意,我们也手动终止了几个进程:kill <process_id>;所以这仍然是必要的。
总的来说,我们的结论是,令人难以置信的是,我们的日志或警告都没有直接提到磁盘空间不足,但这似乎确实是根本原因。
其他回答
尝试更新以下两个参数,因为它们必须具有默认值。
Innodb_lock_wait_timeout = 50
innodb_rollback_on_timeout = ON
要检查参数值,可以使用下面的SQL语句。
显示全局变量:innodb_rollback_on_timeout
我在使用php时遇到过这种情况 语言构念退出;正在进行交易。那么这个 事务“挂起”,你需要杀死mysql进程(如上所述processlist;)
我来自谷歌,我只是想添加对我有效的解决方案。我的问题是,我试图删除一个大表的记录,它有很多FK级联,所以我得到了与OP相同的错误。
我禁用了自动提交,然后它只在SQL语句的末尾添加COMMIT。据我所知,这将逐位释放缓冲区,而不是在命令结束时等待。
为了保持OP的示例,这应该是有效的:
Mysql > set autocommit=0;
Mysql > update customer set account_import_id = 1;提交;
不要忘记重新激活自动提交,如果你想让MySQL配置和以前一样。
Mysql > set autocommit=1;
查看一下您的数据库是否进行了微调,特别是事务隔离。增加innodb_lock_wait_timeout变量不是一个好主意。
检查MySQL中的数据库事务隔离级别:
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)
您可以通过更改隔离级别来获得改进。使用类似oracle的READ COMMITTED而不是REPEATABLE READ。REPEATABLE READ是InnoDB的默认值。
mysql> SET tx_isolation = 'READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL tx_isolation = 'READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)
此外,仅在必要时尝试使用SELECT FOR UPDATE。
在做一些测试时,我也遇到过类似的问题。
原因-在我的情况下,事务没有从我的spring引导应用程序提交,因为我在执行期间杀死了@transactional函数(当函数更新一些行时)。由于该事务从未提交到数据库(MySQL)。
结果-不能从任何地方更新这些行。但是能够更新表的其他行。
mysql> update some_table set some_value = "Hello World" where id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
解决方案-杀死所有MySQL进程使用
Sudo killall -9 mysqld
Sudo killall -9 mysqld_safe(当发生错误时重新启动服务器,并将运行时信息记录到错误日志中。在我的情况下不需要)