Jag kunde bara verkligen åstadkomma detta genom att manuellt utfärda ett låsmeddelande till en tabell. Detta gör en fullständig bordslås, så var försiktig med det! I mitt fall var det användbart för att skapa en kö som jag inte ville att flera processer rörde samtidigt.
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();
}
Uppdatera - I Entity Framework 6, speciellt med async
/ await
kod måste du hantera transaktionerna annorlunda. Det här kraschade för oss efter några konverteringar.
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();
}