У меня есть таблица базы данных и соответствующий класс сущности (POCO с прокси-сервером отслеживания изменений) с членом, который действует как счетчик:
class MyEntity
{
public virtual int ID { get; set; }
public virtual int Counter { get; set; }
}
В моем веб-приложении есть функция, которая должна извлечь этосущность по идентификатору, прочитайте Counter
(который затем используется для назначения другим объектам), увеличьте его и запишите сущность обратно в базу данных, например, так:
public int GetNewCounter(int ID)
{
int newCounter = 0;
using (MyObjectContext ctx = new MyObjectContext())
{
MyEntity ent = ctx.MyEntities.Where(e => e.ID == ID).Single();
++ent.Counter;
newCounter = ent.Counter;
ctx.SaveChanges();
}
return newCounter;
}
// newCounter is now used for other stuff
Два или более пользователей могутсделать это одновременно (с сущностью с одинаковым идентификатором), и я должен убедиться, что они не читают и не используют один и тот же счетчик (поэтому второй пользователь не сможет получить счетчик до того, как первый пользователь получитсохранил увеличенный счетчик обратно в базу данных).
Можно ли "заблокировать" сущность до того, как она будет прочитана, и снять блокировку после обратной записи изменения счетчика, а затем проверить наличие блокировки, когда другой пользовательпытается прочитать ту же сущность?Это разумный шаблон вообще?
Какие варианты у меня есть для реализации этого требования с Entity Framework (EF 4)?
Я очень незнаком с функциями и идеями параллелизма в SQL Serverи Entity Framework, и мы будем рады получить помощь в правильном направлении с этой конкретной проблемой.
Заранее спасибо!