Som forventet
-
SELECT med ORDER BY, uden ROWLOCK, uden indeks vil have en tabellås på grund af en scanning/mellemsortering for at finde TOP 2. Så den 2. session springer hele tabellen over på grund af READPAST
-
SELECT uden ORDER BY vælger bare 2 rækker, som tilfældigvis er i rækkefølge efter indsættelse (ren tilfældighed, der er ingen underforstået rækkefølge). Det faktum, at disse 2 rækker er låst, får den 2. session til at springe til de næste ikke-låste rækker.
SQL Server forsøger at holde låse så granulære som muligt, men scanningen betyder en tabellås. Nu ville dette normalt ikke gøre en forskel (det ville være en delt læselås), men du har også UPDLOCK, hvilket betyder et udelukkende låst bord
Så du har brug for begge disse
- 3 tip i SELECT-forespørgslerne (ROWLOCK, UPDLOCK, READPAST) for at kontrollere granularitet, isolation og samtidighed.
Brug af kun ROWLOCK vil stadig få en eksklusiv lås på hver række til at scanne/sortere. - et indeks på
Value
INDLÆGTestID
for at gøre SELECT effektiv. Kun et indeks vil sandsynligvis rette op på samtidigheden, men det vil ikke være garanteret.
I et af dine tidligere spørgsmål linkede jeg til mit svar (i en kommentar) til SQL Server Process Queue Race Condition hvor jeg har alle 3 låsetips