我正在运行以下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行。
当前回答
如果您刚刚终止了一个大型查询,那么回滚将需要时间。如果在已终止查询回滚之前发出另一个查询,则可能会得到一个锁定超时错误。这就是我的遭遇。解决办法就是再等一会儿。
细节:
我发出了一个DELETE查询,从大约100万行中删除大约90万行。
我错误地运行了这个(只删除了10%的行): 删除MOD(id,10) = 0的表
而不是这样(删除90%的行): 删除表中MOD(id,10) != 0
我想要删除90%的行,而不是10%。因此,我在MySQL命令行中终止了进程,因为我知道它会回滚到目前为止删除的所有行。
然后我立即运行了正确的命令,并在不久之后得到了一个锁定超时超过错误。我意识到锁实际上可能是被杀死的查询的回滚仍然在后台发生。所以我等了几秒钟,重新运行了查询。
其他回答
如果您刚刚终止了一个大型查询,那么回滚将需要时间。如果在已终止查询回滚之前发出另一个查询,则可能会得到一个锁定超时错误。这就是我的遭遇。解决办法就是再等一会儿。
细节:
我发出了一个DELETE查询,从大约100万行中删除大约90万行。
我错误地运行了这个(只删除了10%的行): 删除MOD(id,10) = 0的表
而不是这样(删除90%的行): 删除表中MOD(id,10) != 0
我想要删除90%的行,而不是10%。因此,我在MySQL命令行中终止了进程,因为我知道它会回滚到目前为止删除的所有行。
然后我立即运行了正确的命令,并在不久之后得到了一个锁定超时超过错误。我意识到锁实际上可能是被杀死的查询的回滚仍然在后台发生。所以我等了几秒钟,重新运行了查询。
mysql> set innodb_lock_wait_timeout=100;
Query OK, 0 rows affected (0.02 sec)
mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 100 |
+--------------------------+-------+
现在再打开锁。你有100秒的时间向数据库发出一个SHOW ENGINE INNODB STATUS\G,并查看其他哪个事务正在锁定你的事务。
您是否可以更新这个表中的任何其他记录,或者这个表是否被大量使用?我想的是,当它试图获得一个锁,它需要更新这条记录时,设置的超时已经超时。你可以延长时间,这可能会有所帮助。
mysql->SHOW PROCESSLIST;
kill xxxx;
然后杀了睡着的那个。对我来说是2156。
我在使用python访问mysql数据库时遇到了类似的错误。 python程序使用了while和for循环。 关闭游标和链接在适当的行解决问题 https://github.com/nishishailesh/sensa_host_com/blob/master/sensa_write.py 见第230行 似乎是询问重复链接而没有关闭前一个链接产生了这个错误