【发布时间】:2013-08-01 00:40:30
【问题描述】:
我有一个使用 Entity Framework 4.0 访问的 MySQL 服务器。在数据库中,我有一个名为 Works 的表,其中一些重要。我用 Asp.net 开发网站。该表可同时访问更多用户。这种情况会导致错误的增量问题。
我的代码是这样的:
dbEntities myEntity = new dbEntities();
var currentWork = myEntity.works.Where(xXx => xXx.RID == 208).FirstOrDefault();
Console.WriteLine("Access work");
if (currentWork != null)
{
Console.WriteLine("Access is not null");
currentWork.WordCount += 5;//Default WordCount is 0
Console.WriteLine("Count changed");
myEntity.SaveChanges();
Console.WriteLine("Save changes");
}
Console.WriteLine("Current Count:" + currentWork.WordCount);
如果多个线程同时访问数据库,则只保留最后一次更改。
电流输出:
t1:线程一 - t2:线程二
t1:访问工作
t2:访问工作
t2: 访问不为空
t1: 访问不为空
t1:计数改变
t2:计数改变
t1:保存更改
t2:保存更改
t1:当前计数:5
t2:当前计数:5
预期输出:
t1:访问工作
t2:访问工作
t2: 访问不为空
t1: 访问不为空
t1:计数改变
t2:计数改变
t1:保存更改
t2:保存更改
t1:当前计数:5
t2:当前计数:10
我知道为什么会出现这个问题,因为这段代码不是原子的。怎么转原子操作?
【问题讨论】:
-
我知道在 MsSql 中你可以进行事务,你可以在 MySql 中做同样的事情吗?我也知道
SaveChanges()允许使用布尔值,但我认为这在这种情况下不会有帮助。 -
你能试试这个吗,
lock (currentWork ) { Console.WriteLine("Access is not null"); currentWork.WordCount += 5;//Default WordCount is 0 Console.WriteLine("Count changed"); myEntity.SaveChanges(); Console.WriteLine("Save changes"); }我已经有一段时间没有做像样的线程了 -
哦,顺便说一句:一个好技巧。您可以将
where条件放在first or default中,然后完全删除where。 -
@gunr2171 这个技巧有助于提高性能吗?或者技巧可以帮助提高查询的可读性?
-
@Dreamcatcher,我认为它使它更具可读性,但我不确定性能。我认为它会为你做
where。当您有大量查询时很有用。
标签: c# asp.net mysql entity-framework entity-framework-4.1