我有一个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密集型工作),我都希望坚持这种并发方法。
任何有关如何解决僵局的建议都表示赞赏。
答案 0 :(得分:0)
根据@KamranFarzami的建议,@ Grey的答案解决了我的问题。回答这个问题的关键在于他们。
SNAPSHOT的事务隔离级别可防止发生死锁。