Wie erwartet
-
Das SELECT mit ORDER BY, ohne ROWLOCK, ohne Index hat eine Tabellensperre wegen einer Suche/Zwischensortierung, um TOP 2 zu ermitteln. Daher überspringt die 2. Sitzung die gesamte Tabelle wegen READPAST
-
Das SELECT ohne ORDER BY wählt nur 2 beliebige Zeilen aus, die zufällig in der Reihenfolge der Einfügung sind (rein Zufall, es gibt keine implizite Reihenfolge). Die Tatsache, dass diese 2 Zeilen gesperrt sind, bewirkt, dass die 2. Sitzung zu den nächsten nicht gesperrten Zeilen springt.
SQL Server versucht, Sperren so granular wie möglich zu halten, aber der Scan bedeutet eine Tabellensperre. Nun, das würde normalerweise keinen Unterschied machen (es wäre eine gemeinsame Lesesperre), aber Sie haben auch UPDLOCK, was eine exklusiv gesperrte Tabelle bedeutet
Sie brauchen also beides
- 3 Hinweise in den SELECT-Abfragen (ROWLOCK, UPDLOCK, READPAST) zur Steuerung von Granularität, Isolation und Parallelität.
Die ausschließliche Verwendung von ROWLOCK bewirkt weiterhin eine exklusive Sperre für jede zu scannende/sortierende Zeile. - ein Index für
Value
TestID
EINSCHLIESSEN um die SELECT effizient zu machen. Ein Index allein wird wahrscheinlich die Parallelität beheben, aber es wird nicht garantiert.
In einer Ihrer vorherigen Fragen habe ich meine Antwort (in einem Kommentar) auf SQL Server Process Queue Race Condition wo ich alle 3 Sperrhinweise habe