Skutečně jsem toho dokázal dosáhnout pouze ručním zadáním příkazu zámku do tabulky. Tím je dokončeno zámek stolu, tak s ním opatrně! V mém případě to bylo užitečné pro vytvoření fronty, které jsem nechtěl, aby se dotýkalo více procesů najednou.
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();
}
Aktualizovat - V Entity Framework 6, zejména s async
/ await
kód, musíte s transakcemi zacházet jinak. Po několika konverzích se nám to zhroutilo.
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();
}