Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso bloquear uma tabela em leitura, usando o Entity Framework?


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();
}