Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak mogę zablokować tabelę podczas odczytu przy użyciu Entity Framework?

Udało mi się to naprawdę osiągnąć tylko przez ręczne wydawanie instrukcji lock do tabeli. To robi kompletne blokada stołu, więc bądź z nią ostrożny! W moim przypadku było to przydatne przy tworzeniu kolejki, której nie chciałem, aby wiele procesów stykało się jednocześnie.

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

Aktualizacja — W Entity Framework 6, zwłaszcza z async / await kod, musisz inaczej obsługiwać transakcje. To się zawieszało po kilku konwersjach.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest odpowiednik „tabeli opisowej” w SQL Server?

  2. 3 najważniejsze powody, dla których ludzie przechodzą na SaaS

  3. Jak wywołać procedurę składowaną z argumentami przy użyciu programu sqlcmd.exe?

  4. Słaba wydajność planu wykonania procedury składowanej w SQL - podsłuchiwanie parametrów

  5. Klauzula wyjściowa SQL Server do zmiennej skalarnej