我们有一个每天运行的清除程序。我们使用快照隔离级别。突然间我们收到了错误
错误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)
)
答案 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;