EF防止竞争状况

时间:2013-11-25 14:36:50

标签: c# entity-framework race-condition

我在我的应用程序中使用EF 6 and Code First数据库解决方案。相同的应用程序在多台计算机上运行并访问同一数据库。数据库中的一个整数字段从这些应用程序更新,此字段的值减少。代码如下,我认为这可能是竞争条件问题。在这种情况下你如何解决问题?

public partial class CaContext
{
   public override int SaveChanges()
   {
    var addedStatistics = ChangeTracker.Entries<Statistic>().Where(e => e.State == EntityState.Added).ToList().Select(p => p.Entity).ToList();

    var testOrders = GetUser.Orders.First();
    testOrders.Credits = testOrders.Credits - addedStatistics.Count; //Race condition here


     return base.SaveChanges();
   }
}

3 个答案:

答案 0 :(得分:2)

一种选择是执行一个更新语句,该语句递减值而不是执行读取,计算,写入。

Database.SqlCommand(
  @"UPDATE [CreditCount] 
    SET [Credits] = [Credits] - x 
    WHERE [UserID] = y"
);

答案 1 :(得分:0)

  1. 我会看一下整体设计并删除这样的计数器。例如,您可以创建一个表,每次保存更改时都将添加新记录。您可以在那里设置计数,然后使用SUM查询获得总计。这将消除这个问题。

  2. 如果你真的想拥有这样一个字段,那么你可以创建一个存储过程并调用它。 SP将在数据库上运行,并具有对数据的同步访问权。

答案 2 :(得分:0)

在事务范围内执行操作(可能必须设置正确的隔离级别)。因此,只需将SaveChanges()调用包装到事务范围中:

public void method() {
    using(var transactionScope = new TransactionScope()) {
        _context.SaveChanges();
    }
}

您可以在此处找到更多信息:http://msdn.microsoft.com/en-us/data/dn456843#transactionScope