У меня есть сервер MySQL, к которому я обращаюсь, используя Entity Framework 4.0. В базе данных у меня есть таблица с именем Работы, в которую входят некоторые подсчеты. Я разрабатываю веб-сайт с 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: Thread One - t2: Thread Two
t1: Работа с доступом
t2: Работа с доступом
t2: доступ не равен null
t1: Доступ не равен null
t1: смененный счетчик
t2: количество измененных
t1: сохранить изменения
t2: сохранить изменения
t1: Текущее количество: 5
t2: Текущее количество: 5
Ожидаемый результат:
t1: Работа с доступом
t2: Работа с доступом
t2: доступ не равен null
t1: Доступ не равен null
t1: смененный счетчик
t2: количество измененных
t1: сохранить изменения
t2: сохранить изменения
t1: Текущее количество: 5
t2: Текущее количество: 10
Я знаю, почему эта проблема возникает, потому что этот код не является атомарным. Как я могу запустить атомную операцию?