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