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