每当我们收到传入的文件时,我都会调用一个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
的交易中。
事情变得更糟,我开始遇到死锁错误!!!
我在这里做错了吗?
答案 0 :(得分:1)
如果性能通过更改隔离级别成为问题,那么您可以尝试重新设计解决方案以使用消息队列。
随着文件的到来:
答案 1 :(得分:0)
尝试将隔离级别更改为Read Committed。
Serializable是一个超级大交易锤。 它将阻止其他进程读取已修改但未提交的数据。结合你在sp中的两套进程,你肯定会遇到死锁。