Podle očekávání
-
SELECT s ORDER BY, bez ROWLOCK, bez indexu bude mít zámek tabulky kvůli skenování/přechodnému řazení, aby vyšlo TOP 2. Takže 2. relace přeskočí celou tabulku kvůli READPAST
-
SELECT bez ORDER BY pouze vybírá libovolné 2 řádky, které jsou náhodou v pořadí vložení (čirá náhoda, neexistuje žádné předpokládané pořadí). Skutečnost, že tyto 2 řádky jsou uzamčeny, způsobí, že 2. relace přeskočí na další nezamknuté řádky.
SQL Server se pokouší udržet zámky co nejpodrobnější, ale skenování znamená zámek tabulky. Nyní by to normálně nedělalo rozdíl (bylo by to sdílený zámek čtení), ale máte také UPDLOCK, což znamená výhradně zamčenou tabulku
Takže potřebujete obojí
- 3 tipy v dotazech SELECT (ROWLOCK, UPDLOCK, READPAST) pro ovládání granularity, izolace a souběžnosti.
Použití pouze ROWLOCK způsobí výhradní zámek na každém řádku pro skenování/třídění. - index na
Value
INCLUDETestID
aby byl SELECT efektivní. Pouze index pravděpodobně opraví souběžnost, ale nebude zaručena.
V jedné z vašich předchozích otázek jsem propojil svou odpověď (v komentáři) na Podmínka závodu ve frontě procesu serveru SQL kde mám všechny 3 tipy na zámek