插入和更新之间的死锁

时间:2016-07-12 08:18:58

标签: sql-server spring hibernate transactions

我有2种方法注释

@Transactional(isolation = Isolation.READ_UNCOMMITTED)

该方法并行运行

  • 方法1)在表A中插入行

  • 方法2)更新表A中的行

但有时我在两个查询之间有一个死锁:1次插入和1次更新。

我没有说明为什么我得到这个LockAcquisitionException,因为当我检查sql profiler时,insert查询和udpate查询没有任何共同点=>我不是要更新并插入相同的行(id值不同)。

为什么以及如何发生这种情况?

谢谢!

enter image description here

1 个答案:

答案 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 =>死锁