我有一个用
注释的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并行运行并回滚其中一个),为什么锁定等待超时情况会显现?
答案 0 :(得分:0)
阅读需要FOR UPDATE
或LOCK IN SHARE MODE
。
如果这还不够,请向我们展示从BEGIN
到COMMIT
和SHOW CREATE TABLE
的sql语句。