Eu só consegui realmente fazer isso emitindo manualmente uma instrução de bloqueio para uma tabela. Isso faz um completo bloqueio de mesa, então tenha cuidado com isso! No meu caso, foi útil para criar uma fila que eu não queria que vários processos tocassem ao mesmo tempo.
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();
}
Atualizar - No Entity Framework 6, especialmente com
async
/ await
código, você precisa lidar com as transações de forma diferente. Isso estava falhando para nós depois de algumas conversões. 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();
}