使用可序列化隔离为同一事务的2个实例获取死锁

时间:2017-01-08 03:57:40

标签: java mysql spring transactions innodb

我有一个用

注释的Spring事务
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)和&等待表T2上的'X'模式锁定。

最后,Txn1回滚。

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

此外,如果这是隔离的工作方式(允许txns并行运行并回滚其中一个),为什么锁定等待超时情况会显现?

1 个答案:

答案 0 :(得分:0)

阅读需要FOR UPDATELOCK IN SHARE MODE

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