2017-08-16 60 views
1

我有这个奇怪的死锁问题,一直在窃听我。该方案如下:来自2个存储过程的2个查询之间的死锁

Deadlock_Graph

按照照片,第二存储过程不能,直到它在表中被第一次插入更新该锦标赛数字数据。在这种情况下它怎么可能会陷入僵局?我怎样才能重现它并避免它呢?

谢谢。

第二截图:

Deadlock_Graph 2

+0

我们可以看到特效? –

+0

没有办法让我们用给出的信息100%回答这个问题,但我猜测该图不包括链接表,那些表导致了死锁。另一个可能的原因是SP2正在更新多行并进行一次更新,但在等待下一次更新时不释放表锁。 – Hogan

+0

@AaronDietz - 更新后,我添加了第二张照片。 – Claudio

回答

1

查看主要问题的意见的前同步。这里的问题是两个表(AB)以不同的顺序,因此发生这样的事情:

  1. SP1完成并释放ID N1。
  2. SP2采用id n1并锁定表B
  3. SP1以新号码开始并锁定表A。然后尝试锁定表B但SP2有它。
  4. SP2现在试图锁定表A,但SP1有它。

僵局

注:这基本上是每一个僵局如何发生的围绕它只是一些复杂的绒毛。这是关于锁定表格并释放它们的顺序。如果所有内容都以相同的顺序锁定和释放,则永远不应该发生死锁。

+0

@Hogan无效:-(我尝试过,但第一个SP只是插入新的比赛号码,没有任何问题,即使锁定在桌面上并且SP2没有死锁。 – Claudio

+0

@Claudio - 什么没有工作吗?这听起来像是改变SP2的顺序,使它不是死锁 - 是不是目标? – Hogan

+0

是的,但我试图首先重现它作为开发环境,它不会死锁任何方式。它是不能被再现的那些之一(例如,甚至当使用WAITFOR DELAY'00:00:10'时)? – Claudio