我们有一个每天运行的清除过程。我们使用快照隔离水平。突然我们遇到了一个错误
错误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;