SQL 2014中的快照隔离级别错误:由于更新冲突导致快照隔离事务中止

时间:2018-04-03 08:38:21

标签: sql-server sql-server-2014 isolation-level

我们有一个每天运行的清除程序。我们使用快照隔离级别。突然间我们收到了错误

  

错误3960 - 由于更新冲突导致快照隔离事务中止。您不能使用快照隔离来访问表' dbo.SXAVWFInboundEventQueue'直接或间接地在数据库' PROD'更新,删除或插入已被其他事务修改或删除的行。重试事务或更改更新/删除语句的隔离级别。

以下是程序中的代码。

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)
)

1 个答案:

答案 0 :(得分:1)

我希望使用这两种方法执行相同的执行计划,因此当尝试修改在update语句运行时更改的行时,您可能仍会遇到并发冲突。

如果要更新许多行,请尝试对更新进行批处理以降低并发冲突的可能性:

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;