即使我没有使用事务,也会出现“超过锁定等待超时;尝试重新启动事务”

新手上路,请多包涵

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

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

我没有使用交易,为什么会出现此错误?我什至尝试重新启动我的 MySQL 服务器,但没有帮助。

该表有 406,733 行。

原文由 Jason Swett 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 403
2 个回答

您正在使用交易; autocommit 不会禁用事务,它只是让它们在语句结束时自动提交。

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

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

SHOW ENGINE INNODB STATUS

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

原文由 MarkR 发布,翻译遵循 CC BY-SA 4.0 许可协议

我在做一些测试时遇到了类似的问题。

原因- 在我的情况下,我的 Spring Boot 应用程序没有提交事务,因为我在执行期间杀死了 @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 (发生错误时重新启动服务器并将运行时信息记录到错误日志中。在我的情况下不需要)

原文由 Satish Kumar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题