我发现了很多关于并发错误的主题,但似乎它们都是关于保持数据库或客户端值,但我需要某种混合解决方案 - 从数据库重新加载初始值并重试更改它(不是只需用客户端值替换商店价值。)
问题描述
假设我有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专家可以看一看并验证这应该有效或建议更好/正确的方法来处理此类场景中的并发性?