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
INCLUDETestID
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