我有2种方法注释
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
该方法并行运行
方法1)在表A中插入行
方法2)更新表A中的行
但有时我在两个查询之间有一个死锁:1次插入和1次更新。
我没有说明为什么我得到这个LockAcquisitionException,因为当我检查sql profiler时,insert查询和udpate查询没有任何共同点=>我不是要更新并插入相同的行(id值不同)。
为什么以及如何发生这种情况?
谢谢!
答案 0 :(得分:0)
我通过禁用索引
上的PAGE_LOCK解决了这个问题WITH (ALLOW_PAGE_LOCKS = OFF)
我意识到我有:
交易1 更新表A然后更新表B
交易2 更新表B然后更新表A
死亡互相锁定(因为交易1很长〜5分钟)
表A上的T1锁定页面
表B上的T2锁定页面Y
T2请求锁定表A上的页面X并等待
(后来T1想要更新表B)
表B上的T1请求锁定页面Y =>死锁