我有一些并发问题。我读了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?

[update#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实体框架的基础。 DbUpdateConcurrencyException由实体框架生成。如果不通过连接/命令对象直接使用ADO.NET,则在使用实体框架时不应遇到OptimisticConcurrencyException。

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

10-13 08:03