我正在运行以下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行。
当前回答
有同样的错误,即使我只是更新一个表与一个条目,但重新启动mysql后,它被解决了。
其他回答
完全符合MarkR的说法。自动提交使每个语句成为一个语句事务。
SHOW ENGINE INNODB STATUS会给你一些死锁原因的线索。还要仔细查看慢速查询日志,看看还有什么正在查询表,并尝试删除正在执行满表罐操作的任何内容。行级锁定工作得很好,但当您试图锁定所有行的时候就不行了!
确保数据库表使用InnoDB存储引擎和READ-COMMITTED事务隔离级别。
你可以通过SELECT @@GLOBAL来检查它。tx_isolation @@tx_isolation;在mysql控制台。
如果没有设置为READ-COMMITTED,则必须设置它。在设置之前,请确保您在mysql中拥有SUPER权限。
你可以从http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html上获得帮助。
通过设置这个,我认为你的问题会得到解决。
您可能还希望检查是否试图同时在两个进程中更新此文件。用户(@tala)在这种情况下遇到了类似的错误消息,可能需要仔细检查…
某些东西阻塞了查询的执行。很可能是另一个查询更新、插入或删除查询中的某个表。你必须找出那是什么:
SHOW PROCESSLIST;
一旦你找到阻塞进程,找到它的id并运行:
KILL {id};
重新运行初始查询。
在我的实例中,我正在运行一个异常查询来修复数据。如果你在你的查询中锁定了表,那么你将不必处理锁定超时:
LOCK TABLES `customer` WRITE;
update customer set account_import_id = 1;
UNLOCK TABLES;
这对于正常使用可能不是一个好主意。
更多信息请参见:MySQL 8.0参考手册
尝试更新以下两个参数,因为它们必须具有默认值。
Innodb_lock_wait_timeout = 50
innodb_rollback_on_timeout = ON
要检查参数值,可以使用下面的SQL语句。
显示全局变量:innodb_rollback_on_timeout