Я хотел бы заблокировать указанные строки в моей таблице исключительно, поэтому никакие обновления не разрешены до тех пор, пока фактическая транзакция не завершится. Чтобы сделать это, я создал вспомогательный класс в моем хранилище базы данных:Пессимистическая блокировка в коде EF сперва
public void PessimisticMyEntityHandler(Action<IEnumerable<MyEntity>> fieldUpdater, string sql, params object[] parameters)
{
using (var scope = new System.Transactions.TransactionScope())
{
fieldUpdater(DbContext.Set<MyEntity>().SqlQuery(sql, parameters));
scope.Complete();
}
}
Вот мой тестовый код. В основном я только начинаю две задачи, и они оба пытаются заблокировать строку с идентификатором «1». Я предполагал, что вторая задача не сможет прочитать (и обновить) строку до тех пор, пока первая не завершит свое задание, но окно вывода показывает, что это действительно возможно.
Task.Factory.StartNew(() =>
{
var dbRepo = new DatabaseRepository();
dbRepo.PessimisticMyEntityHandler(myEntities =>
{
Debug.WriteLine("entered into lock1");
/* Modify some properties considering the current ones... */
var myEntity = myEntities.First();
Thread.Sleep(1500);
myEntity.MyEntityCode = "abcdefgh";
dbRepo.Update<MyEntity>(myEntity);
Debug.WriteLine("leaving lock1");
}, "SELECT * FROM MyEntities WITH (UPDLOCK, HOLDLOCK) WHERE Id = @param1", new SqlParameter("param1", 1));
});
Task.Factory.StartNew(() =>
{
Thread.Sleep(500);
var dbRepo = new DatabaseRepository();
dbRepo.PessimisticMyEntityHandler(myEntities =>
{
Debug.WriteLine("entered into lock2");
/* Modify some properties considering the current ones... */
var myEntity = myEntities.First();
myEntity.MyEntityCode = "xyz";
dbRepo.Update<MyEntity>(myEntity);
Debug.WriteLine("leaving lock2");
}, "SELECT * FROM MyEntities WITH (UPDLOCK, HOLDLOCK) WHERE Id = @param1", new SqlParameter("param1", 1));
});
окно Output:
entered into lock1
entered into lock2
leaving lock2
leaving lock1
Спасибо за ответ, но, как вы можете видеть из моего кода, я уже знаю это (явно не все). Я просто не понимаю, почему мой код не работает. – laszlokiss88
Не могли бы вы привести пример кода, чтобы показать, как вы это делаете в своих проектах? – laszlokiss88
@ laszlokiss88 Я обновил ответ. Так понятно? – Alireza