Както се очакваше
-
SELECT с ORDER BY, без ROWLOCK, без индекс ще има заключване на таблица поради сканиране/междинно сортиране, за да изработи TOP 2. Така че втората сесия пропуска цялата таблица поради READPAST
-
SELECT без ORDER BY просто избира всеки 2 реда, които случайно са в реда на вмъкване (чисто съвпадение, няма подразбиращ се ред). Фактът, че тези 2 реда са заключени, кара втората сесия да прескочи до следващите незаключени редове.
SQL Server се опитва да поддържа заключванията възможно най-подробни, но сканирането означава заключване на таблица. Сега, това обикновено не би имало значение (ще бъде споделена ключалка за четене), но имате и UPDLOCK, което означава изключително заключена таблица
И така, имате нужда и от двете
- 3 подсказки в заявките SELECT (ROWLOCK, UPDLOCK, READPAST) за контрол на детайлността, изолацията и паралелността.
Използването само на ROWLOCK пак ще доведе до изключително заключване на всеки ред за сканиране/сортиране. - индекс на
Value
ВКЛЮЧЕТЕTestID
за да направите SELECT ефективен. Само индекс вероятно ще коригира паралелността, но няма да е гарантирано.
В един от предишните ви въпроси направих връзка към моя отговор (в коментар) към Условие за надпревара на опашка за процес на SQL Server където имам всичките 3 съвета за заключване