我在我的应用程序中使用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();
}
}
答案 0 :(得分:2)
一种选择是执行一个更新语句,该语句递减值而不是执行读取,计算,写入。
Database.SqlCommand(
@"UPDATE [CreditCount]
SET [Credits] = [Credits] - x
WHERE [UserID] = y"
);
答案 1 :(得分:0)
我会看一下整体设计并删除这样的计数器。例如,您可以创建一个表,每次保存更改时都将添加新记录。您可以在那里设置计数,然后使用SUM查询获得总计。这将消除这个问题。
如果你真的想拥有这样一个字段,那么你可以创建一个存储过程并调用它。 SP将在数据库上运行,并具有对数据的同步访问权。
答案 2 :(得分:0)
在事务范围内执行操作(可能必须设置正确的隔离级别)。因此,只需将SaveChanges()调用包装到事务范围中:
public void method() {
using(var transactionScope = new TransactionScope()) {
_context.SaveChanges();
}
}
您可以在此处找到更多信息:http://msdn.microsoft.com/en-us/data/dn456843#transactionScope