Успях наистина да постигна това само чрез ръчно издаване на оператор за заключване на таблица. Това е пълно заключване на масата, така че внимавайте с него! В моя случай беше полезно за създаване на опашка, която не исках няколко процеса да се докосват наведнъж.
using (Entities entities = new Entities())
using (TransactionScope scope = new TransactionScope())
{
//Lock the table during this transaction
entities.Database.ExecuteSqlCommand("SELECT TOP 1 KeyColumn FROM MyTable WITH (TABLOCKX, HOLDLOCK)");
//Do your work with the locked table here...
//Complete the scope here to commit, otherwise it will rollback
//The table lock will be released after we exit the TransactionScope block
scope.Complete();
}
Актуализиране - В Entity Framework 6, особено с async
/ await
код, трябва да обработвате транзакциите по различен начин. Това се срина за нас след някои преобразувания.
using (Entities entities = new Entities())
using (DbContextTransaction scope = entities.Database.BeginTransaction())
{
//Lock the table during this transaction
entities.Database.ExecuteSqlCommand("SELECT TOP 1 KeyColumn FROM MyTable WITH (TABLOCKX, HOLDLOCK)");
//Do your work with the locked table here...
//Complete the scope here to commit, otherwise it will rollback
//The table lock will be released after we exit the TransactionScope block
scope.Commit();
}