gpt4 book ai didi

c# - 从死锁更新

转载 作者:太空宇宙 更新时间:2023-11-03 15:12:16 25 4
gpt4 key购买 nike

我有一个 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: Deadlock graph

是的,在这个特定的例子中,并发并没有真正增加任何值(value),但这是“重置”查询;在 C# 中执行一些 [Options] 计算的“重新计算”查询,批量插入回 SQL 并稍后在并发模式下更新显着加快了速度。

如果可能的话,无论任务是什么(简单的重置还是 CPU 密集型工作),我都想坚持使用这种并发方法。

如有任何解决僵局的建议,我们将不胜感激。

最佳答案

正如@KamranFarzami 所建议的那样,@Grantly 的回答解决了我的问题。回答这个问题的重点在于他们。

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

关于c# - 从死锁更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40639751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com