Jeg var kun i stand til virkelig at opnå dette ved manuelt at udstede en låseerklæring til en tabel. Dette gør en fuldstændig bordlås, så vær forsigtig med den! I mit tilfælde var det nyttigt til at oprette en kø, som jeg ikke ønskede, at flere processer rørte på én gang.
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();
}
Opdater - I Entity Framework 6, især med async
/ await
kode, skal du håndtere transaktionerne anderledes. Dette gik ned for os efter nogle konverteringer.
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();
}