Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich eine Tabelle beim Lesen mit Entity Framework sperren?

Ich konnte dies nur wirklich erreichen, indem ich manuell eine Sperranweisung an eine Tabelle ausgab. Dies ist ein Abschluss Tischsperre, also seien Sie vorsichtig damit! In meinem Fall war es nützlich, um eine Warteschlange zu erstellen, die nicht von mehreren Prozessen gleichzeitig berührt werden sollte.

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

Aktualisieren - In Entity Framework 6, insbesondere mit async / await code, müssen Sie die Transaktionen anders handhaben. Dies stürzte bei uns nach einigen Konvertierungen ab.

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