SQL 2014中的快照隔离级别错误:由于更新冲突而流产的快照隔离事务



我们有一个每天运行的清除过程。我们使用快照隔离水平。突然我们遇到了一个错误

错误3960-由于更新冲突而流产的快照隔离事务。您不能使用快照隔离来访问表" dbo.sxavwfinboundeventqueue",直接或间接地在数据库" prod"中以更新,删除或插入已通过其他交易进行修改或删除的行。重试交易或更改update/delete语句的隔离级别。

以下是过程中的代码。

UPDATE ie 
SET ContextDetailID = NULL 
from sxavwfinboundeventqueue ie 
     INNER JOIN #ContextDetailWFInstanceTable TBL on ie.ContextDetailID = TBL.ContextDetailID

我们应该使用子查询而不是吗?

UPDATE sxavwfinboundeventqueue 
SET ContextDetailID = NULL 
where ContextDetailID in (select ContextDetailID from  #ContextDetailWFInstanceTable)

温度表的结构

CREATE TABLE #ContextDetailWFInstanceTable  
(
  ContextDetailID bigint not null,
  index #ContextDetailWFInstanceTableIndex clustered (ContextDetailID)
)

我期望通过任何一种技术制定相同的执行计划,因此当尝试修改更新语句运行时更改的行时,您可能仍然会违反并发性。

如果您要更新许多行,请尝试批处更新以减少并发冲突的可能性:

DECLARE @RowsUpdated int = -1;
WHILE @RowsUpdated <> 0
BEGIN
    UPDATE TOP(1000) ie 
    SET ContextDetailID = NULL 
    FROM sxavwfinboundeventqueue ie 
    INNER JOIN #ContextDetailWFInstanceTable TBL ON ie.ContextDetailID = TBL.ContextDetailID;
    SET @RowsUpdated = @@ROWCOUNT;
END;

最新更新