【问题标题】:When is innodb_lock_wait_timeout ignored?何时忽略 innodb_lock_wait_timeout?
【发布时间】:2010-09-20 13:37:34
【问题描述】:

我遇到了一个典型的死锁异常的奇怪案例:

原因:java.sql.BatchUpdateException:尝试获取锁时发现死锁;尝试重启事务。

代码被识别,确实有可能出现死锁。问题是我立即得到了例外。我已将 innodb_lock_wait_timeout 变量设置为 1 小时 (3600)。但是,异常很快就会出现。

到底发生了什么?

【问题讨论】:

  • 也许 MySQL 已经足够聪明,可以识别循环死锁,而不必等待超时。
  • 希望不会。 :-) 是否可以在运行时覆盖超时?

标签: mysql hibernate spring deadlock


【解决方案1】:

你遇到了死锁 lock_wait_timeout 变量是查询在超时之前等待获取锁的时间 - 不是一回事。

从手册: InnoDB 事务在放弃之前可能等待行锁的超时时间(以秒为单位)。默认值为 50 秒。尝试访问被另一个 InnoDB 事务锁定的行的事务最多会挂起这么多秒,然后发出以下错误:

如果您遇到超时,您会看到这个。您有一个需要修复的适当死锁。 ERROR 1205 (HY000): 超过锁定等待超时;尝试重启事务

【讨论】:

  • 有没有办法检查lock_wait_timeout的有效值??
  • 要查看当前值,运行show global variables like '%wait_timeout';
【解决方案2】:

https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_lock_wait_timeout

当启用innodb_deadlock_detect(默认)时,锁等待超时值不适用于死锁

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 2023-04-05
    • 2014-04-30
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多