我正在运行以下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行。
当前回答
在做一些测试时,我也遇到过类似的问题。
原因-在我的情况下,事务没有从我的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(当发生错误时重新启动服务器,并将运行时信息记录到错误日志中。在我的情况下不需要)
其他回答
我在使用python访问mysql数据库时遇到了类似的错误。 python程序使用了while和for循环。 关闭游标和链接在适当的行解决问题 https://github.com/nishishailesh/sensa_host_com/blob/master/sensa_write.py 见第230行 似乎是询问重复链接而没有关闭前一个链接产生了这个错误
如果您刚刚终止了一个大型查询,那么回滚将需要时间。如果在已终止查询回滚之前发出另一个查询,则可能会得到一个锁定超时错误。这就是我的遭遇。解决办法就是再等一会儿。
细节:
我发出了一个DELETE查询,从大约100万行中删除大约90万行。
我错误地运行了这个(只删除了10%的行): 删除MOD(id,10) = 0的表
而不是这样(删除90%的行): 删除表中MOD(id,10) != 0
我想要删除90%的行,而不是10%。因此,我在MySQL命令行中终止了进程,因为我知道它会回滚到目前为止删除的所有行。
然后我立即运行了正确的命令,并在不久之后得到了一个锁定超时超过错误。我意识到锁实际上可能是被杀死的查询的回滚仍然在后台发生。所以我等了几秒钟,重新运行了查询。
在我的实例中,我正在运行一个异常查询来修复数据。如果你在你的查询中锁定了表,那么你将不必处理锁定超时:
LOCK TABLES `customer` WRITE;
update customer set account_import_id = 1;
UNLOCK TABLES;
这对于正常使用可能不是一个好主意。
更多信息请参见:MySQL 8.0参考手册
迟到的派对(像往常一样),但我的问题是我写了一些糟糕的SQL(作为一个新手)和几个进程对记录有一个锁<-不确定适当的措辞。我最终不得不:SHOW PROCESSLIST,然后使用kill <id>杀死id
完全符合MarkR的说法。自动提交使每个语句成为一个语句事务。
SHOW ENGINE INNODB STATUS会给你一些死锁原因的线索。还要仔细查看慢速查询日志,看看还有什么正在查询表,并尝试删除正在执行满表罐操作的任何内容。行级锁定工作得很好,但当您试图锁定所有行的时候就不行了!