Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso bloccare una tabella in lettura, utilizzando Entity Framework?

Sono stato in grado di ottenere questo risultato solo emettendo manualmente un'istruzione di blocco a una tabella. Questo esegue un completo blocco del tavolo, quindi fai attenzione! Nel mio caso è stato utile per creare una coda che non volevo che più processi si toccassero contemporaneamente.

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

Aggiorna - In Entity Framework 6, in particolare con async / await codice, è necessario gestire le transazioni in modo diverso. Per noi si è verificato un arresto anomalo dopo alcune conversioni.

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