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

Zakleszczenie podczas SELECT/UPDATE

Nie wystarczy mieć transakcję z możliwością serializacji, musisz wskazać blokadę, aby to zadziałało.

Serializowany poziom izolacji nadal zwykle uzyskuje „najsłabszy” typ blokady, jaki może, co zapewnia spełnienie możliwych do serializacji warunków (powtarzalne odczyty, brak wierszy fantomowych itp.)

Tak więc chwytasz wspólną blokadę na swoim stole, którą później (w transakcji możliwej do serializacji) próbujesz uaktualnić do blokada aktualizacji. Aktualizacja nie powiedzie się, jeśli inny wątek będzie trzymać wspólną blokadę (będzie działać, jeśli żadne inne ciało nie będzie trzymało wspólnej blokady).

Prawdopodobnie chcesz to zmienić na następujące:

SELECT * FROM SessionTest with (updlock) WHERE SessionId = @SessionId

Zapewni to uzyskanie blokady aktualizacji po wykonaniu SELECT (więc nie będziesz musiał aktualizować blokady).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak asynchronicznie wykonać procedurę składowaną serwera sql i zapewnić jej zakończenie?

  2. Kolumna jest zbyt długa z błędem BULK INSERT

  3. Jak włączyć wszystkie ograniczenia wyboru i klucza obcego dla tabeli w SQL Server (przykłady T-SQL)

  4. Czy T-SQL ma funkcję agregującą do łączenia ciągów?

  5. Czy istnieje błąd w SqlDataReader.HasRows podczas uruchamiania programu SQL Server 2008?