【问题标题】:getting deadlock for 2 instances of same transaction with serializable isolation具有可序列化隔离的同一事务的 2 个实例陷入死锁
【发布时间】:2017-01-08 03:57:40
【问题描述】:

我有一个带有注释的 Spring Transaction

isolation = Isolation.SERIALIZABLE 

交易有以下步骤:

1)Read from MySQL Tables 1, 2[Both InnoDB engine based]
2)Write into Table 1
3)Write into Table 2

现在,当我几乎并行地多次运行同一事务的两个实例时,我得到了两个响应:

1)Lock wait timeout exceeded; try restarting transaction
2)Deadlock found when trying to get lock; try restarting transaction

死锁情况似乎特别有趣(根据 innoDb Engine 的死锁细节):

Txn 1 卡在第 2 步,等待在表 T1 的索引上锁定模式“S”。

Txn 2 卡在第 3 步,在与上述相同的索引上持有模式“X”的锁定,并且具有相同的详细信息(十六进制。ID 与上述锁定中提到的相同)并且正在等待“X”模式锁定表 T2。

最后,Txn1 被回滚。

我觉得某些索引范围锁定导致死锁,但想了解它是如何发生的?

另外,如果隔离是这样工作的(允许 txns 并行运行并回滚其中一个),为什么会出现 Lock Wait 超时情况?

【问题讨论】:

    标签: java mysql spring transactions innodb


    【解决方案1】:

    阅读需要FOR UPDATELOCK IN SHARE MODE

    如果这还不够,请向我们展示从BEGINCOMMITSHOW CREATE TABLE 的sql 语句。

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多