Sql 解决僵局

Sql 解决僵局,sql,deadlock,Sql,Deadlock,每当我们收到传入的文件时,我都会调用一个存储过程来填充一个表。 有时我们会收到多个文件,同时调用该过程。 在程序内部,语句非常简单,如下所示: IF NOT EXISTS (SELECT.... WHERE A=1 B=2) INSERT ... ELSE UPDATE ... WHERE A=1 and B=2 END 这样做,我开始得到一个重复记录错误。我假设有两条相同的记录试图插入。为了避免这种情况,我将这些语句放在具有可序列化隔离级别的事务中 事情变得更糟

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

IF NOT EXISTS (SELECT.... WHERE A=1 B=2)
     INSERT ...
ELSE
     UPDATE ...
     WHERE A=1 and B=2
END
这样做,我开始得到一个重复记录错误。我假设有两条相同的记录试图插入。为了避免这种情况,我将这些语句放在具有
可序列化隔离级别的事务中

事情变得更糟,我开始出现死锁错误


我在这里做的有什么不对吗???

尝试将隔离级别更改为“已提交”

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

有关详细信息,请查看此链接:

如果性能因更改隔离级别而成为问题,则可以尝试重新设计解决方案以使用消息队列

随着文件的出现:

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

  • 我尝试了Read Committed,我认为这是默认级别。但我仍然收到重复记录错误。请尝试读取未提交。虽然对安德鲁的答案做出改变肯定会解决你的问题。