【问题标题】:Snapshot isolation level error in SQL 2014: Snapshot isolation transaction aborted due to update conflictSQL 2014 中的快照隔离级别错误:快照隔离事务因更新冲突而中止
【发布时间】:2018-04-03 08:38:20
【问题描述】:

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

错误 3960 - 快照隔离事务由于更新冲突而中止。您不能使用快照隔离直接或间接访问数据库“PROD”中的表“dbo.SXAVWFInboundEventQueue”来更新、删除或插入已被另一个事务修改或删除的行。重试事务或更改更新/删除语句的隔离级别。

下面是过程中的代码。

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

【问题讨论】:

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


    【解决方案1】:

    我希望这两种技术都具有相同的执行计划,因此当尝试修改更新语句运行时更改的行时,您可能仍然会遇到并发冲突。

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

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2011-02-14
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多