【问题标题】:MySQL - Getting "Lock wait timeout exceeded; try restarting transaction"MySQL - 获取“超过锁定等待超时;尝试重新启动事务”
【发布时间】:2019-03-11 20:32:51
【问题描述】:

我在 Oracle MySQL DB 和 5.7 版本中创建了一个包含 4 列的表。 DB 中的总记录数为 4 912 442。现在我正尝试在 MySQL DB 中再插入 100 000 条记录。

我创建了简单的Spring Boot 应用程序并从文件中读取记录并插入到MySQL DB。

在记录数为 4912442 后将记录插入MySQL DB 时出现以下错误:

[WARN ] SqlExceptionHelper - SQL Error: 1205, SQLState: 40001
[ERROR] SqlExceptionHelper - Lock wait timeout exceeded; try restarting transaction

注意:MySQL 数据库由 MASTER-MASTER 集群在 2 个实例中使用。

即使出现上述错误,也执行以下命令:

SET GLOBAL innodb_lock_wait_timeout = 5000; 
SET innodb_lock_wait_timeout = 5000;

【问题讨论】:

  • 延长超时时间或分批加载数据,每批后提交。
  • 执行了这些命令SET GLOBAL innodb_lock_wait_timeout = 5000; SET innodb_lock_wait_timeout = 5000;,甚至得到了上述错误,并且还在mysql命令行提示符中使用了commit,并再次尝试插入并得到相同的错误。请帮我解决这个问题。 @戈登林诺夫
  • 锁定超时可能意味着您在某处遇到了死锁。如果是这种情况,增加超时可能无济于事,但这完全取决于事务实际在做什么
  • 我如何检查“死锁”你能帮我检查并解决这个问题吗?谢谢。 @apokryfos

标签: mysql spring-boot


【解决方案1】:

Lock wait timeout 通常发生在事务更新/插入正在等待已被其他事务锁定的数据行时。

可能的原因可能是数据量大、表设计不当、约束等。

以下是一些应该可行的解决方案:

  1. 检查锁定等待时间show variables like 'innodb_lock_wait_timeout的当前值;并将其更新为 120 更高的值。

  2. 或者您可以在 /etc/my.cnf 中使用此行将其永久设置为更高的值,但请确保重新启动 MySQL,如果无法重新启动,则只需运行查询 SET GLOBAL innodb_lock_wait_timeout = 120;

    [mysqld]
    innodb_lock_wait_timeout=120
    

【讨论】:

    猜你喜欢
    • 2018-10-09
    • 2015-09-27
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2013-09-22
    • 2013-06-29
    • 2014-08-14
    相关资源
    最近更新 更多