2009-11-09 149 views
0

我有一个存储过程被调用来填充一张表,只要我们收到传入的文件。 有时我们会收到多个文件,同时会调用该过程。 在过程中,语句很简单,如下所示:解决死锁

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

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

事情变得更糟,我开始陷入僵局错误!

有什么问题我在这里做?

回答

0

尝试将隔离级别更改为读取已提交。

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

检查了这一点的详细信息: http://msdn.microsoft.com/en-us/library/ms173763.aspx

+0

我试过Read Committed,我想这是默认级别。但我仍然有重复记录错误。 – wixuser1105 2009-11-09 07:23:22

+0

给读取未提交一个去。尽管在Andrew的答案中做出修改,一定会将你的问题排除在外。 – 2009-11-09 22:26:24

1

如果性能通过改变隔离级别,那么你可以尝试重新构建您的解决方案中使用消息队列成为一个问题。

由于文件有:

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