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

ORDER BY i WITH(ROWLOCK, UPDLOCK, READPAST)

Zgodnie z oczekiwaniami

  • SELECT z ORDER BY, bez ROWLOCK, bez indeksu będzie blokować tabelę z powodu skanowania/sortowania pośredniego, aby wypracować TOP 2. Tak więc druga sesja pomija całą tabelę z powodu READPAST

  • SELECT bez ORDER BY to po prostu wybieranie dowolnych 2 wierszy, które są w kolejności wstawiania (czysty zbieg okoliczności, nie ma dorozumianej kolejności). Fakt, że te 2 wiersze są zablokowane, powoduje, że druga sesja przechodzi do następnych niezablokowanych wierszy.

SQL Server próbuje zachować jak najbardziej szczegółowe blokady, ale skanowanie oznacza blokadę tabeli. Teraz normalnie nie miałoby to znaczenia (byłaby to wspólna blokada odczytu), ale masz też UPDLOCK, co oznacza wyłącznie zablokowaną tabelę

Więc potrzebujesz obu tych

  • 3 wskazówki w zapytaniach SELECT (ROWLOCK, UPDLOCK, READPAST) do kontrolowania szczegółowości, izolacji i współbieżności.
    Używanie tylko ROWLOCK nadal spowoduje wyłączną blokadę każdego wiersza do skanowania/sortowania.
  • indeks Value INCLUDE TestID aby SELECT był wydajny. Tylko indeks prawdopodobnie naprawi współbieżność, ale nie będzie to gwarantowane.

W jednym z Twoich poprzednich pytań połączyłem się z moją odpowiedzią (w komentarzu) do Warunek wyścigu kolejki procesów serwera SQL gdzie mam wszystkie 3 wskazówki dotyczące blokad




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy mogę utworzyć widok na moim serwerze bazy danych z innego serwera bazy danych?

  2. Czy zapytanie REPLACE INTO jest dobrą praktyką?

  3. Zapomniałem hasła do serwera SQL

  4. Haszowanie hasła do SQL

  5. Wstaw wartości z innej tabeli w sql server 2008