Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

ORDER POR e COM (ROWLOCK, UPDLOCK, READPAST)


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 INCLUIR TestID 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