从死锁更新

时间:2016-11-16 18:36:51

标签: c# sql-server multithreading tsql deadlock

我有一个C#/ .NET应用程序,在多个线程(即同时,6个线程)中,尝试执行以下更新:

UPDATE cWrh SET
   [Options] = cStg.[Options] -- byte array
FROM
   [wrh].[Cars] cWrh
      INNER JOIN [stg].[Cars] cStg ON
         cWrh.[Id] = cStg.[Id]
         AND cWrh.[Manufacturer_Id] = @ManufactuerId -- each thread gets different id here
         AND cWrh.[Options] <> cStg.[Options]

这是在事务中运行的一段代码。两个表都有3 + mio记录。聚簇键位于[Id]字段,也有一些非聚集索引。

有趣的是我手动检查并在我的特定示例中使用3 + mio记录cWrh。[Options]和cStg。[Options]总是相同的,所以最后不需要更新。

我附加了死记录图,编辑后的值表示DB.wrh.Cars: here

是的,在这个特定的例子中,并发并没有真正添加任何值,但这是&#34;重置&#34;查询; &#34;重新计算&#34;在C#中执行某些[Options]计算的查询,批量插入到SQL中,稍后在并发模式下更新会显着加快速度。

如果可能的话,无论任务如何(简单的重置与CPU密集型工作),我都希望坚持这种并发方法。

任何有关如何解决僵局的建议都表示赞赏。

1 个答案:

答案 0 :(得分:0)

根据@KamranFarzami的建议,@ Grey的答案解决了我的问题。回答这个问题的关键在于他们。

SNAPSHOT的事务隔离级别可防止发生死锁。