我正在运行以下MySQL UPDATE语句:

mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

我没有使用事务,为什么会得到这个错误?我甚至尝试重新启动我的MySQL服务器,它没有帮助。

该表有406,733行。


当前回答

我在使用python访问mysql数据库时遇到了类似的错误。 python程序使用了while和for循环。 关闭游标和链接在适当的行解决问题 https://github.com/nishishailesh/sensa_host_com/blob/master/sensa_write.py 见第230行 似乎是询问重复链接而没有关闭前一个链接产生了这个错误

其他回答

确保数据库表使用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)在这种情况下遇到了类似的错误消息,可能需要仔细检查…

迟到的派对(像往常一样),但我的问题是我写了一些糟糕的SQL(作为一个新手)和几个进程对记录有一个锁<-不确定适当的措辞。我最终不得不:SHOW PROCESSLIST,然后使用kill <id>杀死id

在我的实例中,我正在运行一个异常查询来修复数据。如果你在你的查询中锁定了表,那么你将不必处理锁定超时:

LOCK TABLES `customer` WRITE;
update customer set account_import_id = 1;
UNLOCK TABLES;

这对于正常使用可能不是一个好主意。

更多信息请参见:MySQL 8.0参考手册

我来自谷歌,我只是想添加对我有效的解决方案。我的问题是,我试图删除一个大表的记录,它有很多FK级联,所以我得到了与OP相同的错误。

我禁用了自动提交,然后它只在SQL语句的末尾添加COMMIT。据我所知,这将逐位释放缓冲区,而不是在命令结束时等待。

为了保持OP的示例,这应该是有效的:

Mysql > set autocommit=0;

Mysql > update customer set account_import_id = 1;提交;

不要忘记重新激活自动提交,如果你想让MySQL配置和以前一样。

Mysql > set autocommit=1;

mysql->SHOW PROCESSLIST;
kill xxxx; 

然后杀了睡着的那个。对我来说是2156。