Como esperado
-
O SELECT com o ORDER BY, sem ROWLOCK, sem índice terá um bloqueio de tabela por causa de um scan/ordenação intermediária para resolver o TOP 2. Então a 2ª sessão pula a tabela inteira por causa do READPAST
-
O SELECT sem o ORDER BY está apenas escolhendo 2 linhas, que estão na ordem de inserção (pura coincidência, não há ordem implícita). O fato de essas 2 linhas estarem bloqueadas faz com que a 2ª sessão pule para as próximas linhas não bloqueadas.
O SQL Server tenta manter os bloqueios o mais granular possível, mas a verificação significa um bloqueio de tabela. Agora, isso normalmente não faria diferença (seria um bloqueio de leitura compartilhado), mas você também tem UPDLOCK, o que significa uma tabela exclusivamente bloqueada
Então você precisa dos dois
- 3 dicas nas consultas SELECT (ROWLOCK, UPDLOCK, READPAST) para controlar granularidade, isolamento e simultaneidade.
Usar apenas ROWLOCK ainda causará um bloqueio exclusivo em cada linha para varredura/classificação. - um índice em
Value
INCLUIRTestID
para tornar o SELECT eficiente. Um índice apenas provavelmente corrigirá a simultaneidade, mas não será garantido.
Em uma de suas perguntas anteriores, vinculei minha resposta (em um comentário) a Condição de corrida da fila de processos do SQL Server onde eu tenho todas as 3 dicas de bloqueio