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

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

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

该表有406,733行。


当前回答

有同样的错误,即使我只是更新一个表与一个条目,但重新启动mysql后,它被解决了。

其他回答

您正在使用一个事务;Autocommit不会禁用事务,它只是让它们在语句的末尾自动提交。

可能发生的情况是,其他一些线程在某个记录上持有记录锁(您正在更新表中的每个记录!)太长时间,而您的线程正在超时。或者在一个事务中对同一行运行多个(2+)UPDATE查询。

可以通过发出命令查看事件的更多详细信息

SHOW ENGINE INNODB STATUS

事件发生后(在SQL编辑器中)。理想情况下,在安静的测试机上执行此操作。

如果您刚刚终止了一个大型查询,那么回滚将需要时间。如果在已终止查询回滚之前发出另一个查询,则可能会得到一个锁定超时错误。这就是我的遭遇。解决办法就是再等一会儿。

细节:

我发出了一个DELETE查询,从大约100万行中删除大约90万行。

我错误地运行了这个(只删除了10%的行): 删除MOD(id,10) = 0的表

而不是这样(删除90%的行): 删除表中MOD(id,10) != 0

我想要删除90%的行,而不是10%。因此,我在MySQL命令行中终止了进程,因为我知道它会回滚到目前为止删除的所有行。

然后我立即运行了正确的命令,并在不久之后得到了一个锁定超时超过错误。我意识到锁实际上可能是被杀死的查询的回滚仍然在后台发生。所以我等了几秒钟,重新运行了查询。

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

完全符合MarkR的说法。自动提交使每个语句成为一个语句事务。

SHOW ENGINE INNODB STATUS会给你一些死锁原因的线索。还要仔细查看慢速查询日志,看看还有什么正在查询表,并尝试删除正在执行满表罐操作的任何内容。行级锁定工作得很好,但当您试图锁定所有行的时候就不行了!

如何强制解锁MySQL中锁定的表:

像这样打破锁可能会导致数据库中的原子性不被强制用于导致锁的sql语句。

这很棘手,正确的解决方案是修复导致锁的应用程序。然而,当美元处于危险之中时,迅速的一脚将使事情再次启动。

1)进入MySQL

mysql -u your_user -p

2)让我们看看锁定的桌子列表

mysql> show open tables where in_use>0;

3)让我们看看当前进程的列表,其中一个正在锁定你的表

mysql> show processlist;

4)终止其中一个进程

mysql> kill <put_process_id_here>;