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