Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je verrouiller une table en lecture à l'aide d'Entity Framework?

Je n'ai pu vraiment accomplir cela qu'en émettant manuellement une instruction de verrouillage sur une table. Cela fait un complet verrou de table, alors soyez prudent avec lui! Dans mon cas, cela a été utile pour créer une file d'attente que je ne voulais pas que plusieurs processus touchent à la fois.

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

Mettre à jour - Dans Entity Framework 6, notamment avec async / await code, vous devez gérer les transactions différemment. Cela plantait pour nous après quelques conversions.

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