Udało mi się to naprawdę osiągnąć tylko przez ręczne wydawanie instrukcji lock do tabeli. To robi kompletne blokada stołu, więc bądź z nią ostrożny! W moim przypadku było to przydatne przy tworzeniu kolejki, której nie chciałem, aby wiele procesów stykało się jednocześnie.
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();
}
Aktualizacja — W Entity Framework 6, zwłaszcza z async
/ await
kod, musisz inaczej obsługiwać transakcje. To się zawieszało po kilku konwersjach.
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();
}