如何正确处理EF并发错误?

时间:2014-10-04 09:05:10

标签: c# concurrency entity-framework-6

我发现了很多关于并发错误的主题,但似乎它们都是关于保持数据库或客户端值,但我需要某种混合解决方案 - 从数据库重新加载初始值并重试更改它(不是只需用客户端值替换商店价值。)

问题描述

假设我有3个表用户订单 OrderSummaries 的数据库(示例为了简化问题说明)< / p>

每个用户都有他的订单,但订单总结在 OrderSummaries 表中。创建新的订单后,新记录将添加到订单表,并在 OrderSummaries 表中更新摘要记录

    //db -> DbContext instance
    var OrderSummariesRecord = db.OrderSummaries.FirstOrDefault(..filter expresion..);
    OrderSummariesRecord.Value += NewOrderRecord.Value;
    db.Entry(OrderSummariesRecord).State = System.Data.Entity.EntityState.Modified;
    db.SaveChanges();

因此,当2个或更多用户同时添加新的 Order 记录时,更新 OrderSummaries 表时可能会出现并发错误

当出现并发错误时,我不想保留存储或客户端值(我发现这是此错误的最佳解决方案),但我想重复上面的OrderSummariesRecord赋值,但使用数据库中的当前OrderSummariesRecord值

我的想法是将这段代码包装成循环,如下所示:

Boolean saved = false;
while (!saved)
{
    try
    {
        var OrderSummariesRecord = db.OrderSummaries.FirstOrDefault(..filter expresion..);

        //would this be enough to make sure, that in the next iterations 
        //(after some concurrency errors has happened) the newest values from the
        //database are acquired?
        db.Refresh(RefreshMode.StoreWins, OrderSummariesRecord);

        OrderSummariesRecord.Value += NewOrderRecord.Value;
        db.Entry(OrderSummariesRecord).State = System.Data.Entity.EntityState.Modified;
        db.SaveChanges();

        saved=true;
    }
    catch (DbUpdateConcurrencyException ex)
    {
        //some logging here
    }
    catch (Exception exc)
    {
        //Don't repeat - there's some other error
        saved=true;
    }
}

目前我无法验证这种方法是否有效......也许来自SO的一些EF专家可以看一看并验证这应该有效或建议更好/正确的方法来处理此类场景中的并发性?

0 个答案:

没有答案