解决僵局

时间:2009-11-09 03:21:30

标签: sql deadlock

每当我们收到传入的文件时,我都会调用一个Store Procedure来填充一个表。 有时我们会收到多个文件,并且会同时调用该过程。 在程序内部,语句非常简单,如下所示:

IF NOT EXISTS (SELECT.... WHERE A=1 B=2)
     INSERT ...
ELSE
     UPDATE ...
     WHERE A=1 and B=2
END

这样做,我开始收到重复的记录错误。我假设2个相同的记录试图INSERT。为了避免这种情况,我将这些语句放在一个带有SERIALIZABLE ISOLATION LEVEL的交易中。

事情变得更糟,我开始遇到死锁错误!!!

我在这里做错了吗?

2 个答案:

答案 0 :(得分:1)

如果性能通过更改隔离级别成为问题,那么您可以尝试重新设计解决方案以使用消息队列。

随着文件的到来:

  1. 调用将文件添加到邮件队列的SP。这将是非阻塞(使用具有自动增量PK的表)
  2. 将一个单独的SP作为计划任务运行,将一条消息从队列中取出(如果有的话),然后对其进行处理。 - 避免死锁。

答案 1 :(得分:0)

尝试将隔离级别更改为Read Committed。

Serializable是一个超级大交易锤。 它将阻止其他进程读取已修改但未提交的数据。结合你在sp中的两套进程,你肯定会遇到死锁。

查看详情: http://msdn.microsoft.com/en-us/library/ms173763.aspx