gpt4 book ai didi

c# - Entity Framework 和 SQL (ADO.NET) 的并发

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

我遇到了一些并发问题。我阅读了 http://blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic-concurrency-in-the-entity-framework.aspx 中的乐观并发处理

我有一段代码可以在我的 WCF 服务中实际测试它:

    public GameResult PurchaseGameItem(int itemId)
{
using (var entities = new GameEntities())
{
var p1 = entities.Items.Where(p => p.ID == itemId).FirstOrDefault();
p1.Coins = 1;

using (var e2 = new GameEntities())
{
var p2 = e2.Items.Where(p => p.ID == itemId).FirstOrDefault();
p2.Coins = 2;
e2.SaveChanges();
}

entities.SaveChanges();
}

return GameResult.Success;
}

此外,我已将模型中的“硬币”并发模式设置为“固定”。然而,这通过了并且保存在数据库中的值是“1”。我试过几组值,所以它并不是“偶然正确”。为什么不在此处引发 OptimisticConcurrencyException?

[更新 #1] 通过尝试下面的第一个响应并将它们结合起来,我设法得到了 DbUpdateConcurrencyException 有时。它仍然不是我所期待的 OptimisticConcurrencyException,但它确实存在。基本上我不知道为什么它不会一直发生。

            var p1 = entities.Items.Where(p => p.ID == itemId).FirstOrDefault();
var p3 = entities.Items.Where(p => p.ID == itemId).FirstOrDefault();

p1.CoinValue = 14;
p3.CoinValue = 115;

using (var e2 = new GameEntities())
{
var p2 = e2.Items.Where(p => p.ID == itemId).FirstOrDefault();
p2.CoinValue = 72;
e2.SaveChanges();
}

entities.SaveChanges(); // This throws DbUpdateConcurrencyException, perhaps 50% of the time.

看起来这里存在并发问题!! :D

[更新 #2] 好吧,我现在想出了一部分,这主要是愚蠢的用户错误。 DbUpdateConcurrencyException 自第二次以来仅抛出一次,第二个子句会将其更新为已有的值,因此该部分是合乎逻辑的。如果从同一上下文中获取了两个实体,则将仅考虑后一个更改,因此在第一个响应所建议的“一个数据库连接”情况下,不会引发并发异常。这是合乎逻辑的,因为是否通过多个句柄访问对象取决于程序员。

但我不明白 DbUpdateConcurrencyException 和 OptimisticConcurrencyException 之间的区别。我无法提出后者。

最佳答案

OptimisticConcurrencyException 来自 ADO.NET,它是 ADO.NET Entity Framework 的基础。 DbUpdateConcurrencyException 由 Entity Framework 生成。如果不通过连接/命令对象直接使用 ADO.NET,则在使用 Entity Framework 时不应遇到 OptimisticConcurrencyException。

关于c# - Entity Framework 和 SQL (ADO.NET) 的并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18187819/

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