Ainda estou solucionando o impasse mencionado nestas perguntas . Com isso, obtive ajuda para entender por que um select manteria um bloqueio compartilhado e pude testar e confirmar isso também.
Agora estou olhando para o segundo spid envolvido no impasse. Essa sessão faz uma atualização usando uma chave primária (WHERE BatchId = @BatchI , BatchId é o PK) e precisa de IX em duas páginas. Inicialmente, não consegui descobrir por que ele precisava de bloqueios em duas páginas de um índice não clusterizado quando estava apenas atualizando uma linha. Então percebi que a atualização para essa linha alteraria a localização da linha no índice não clusterizado e isso poderia ser o motivo pelo qual ela precisa de bloqueios em duas páginas.
Isso é correto?
Em segundo lugar, por favor, ajude a confirmar se meu entendimento sobre esse impasse está correto. Para simplificar, vamos supor que há apenas duas páginas nesse índice não clusterizado. Página1 e Página2. Então é isso que está acontecendo mais ou menos
Assim, alguns testes e o impasse é de fato causado pelo movimento da página dentro do índice não clusterizado causado por uma atualização que altera a posição da linha no índice.
Portanto, inicialmente a Sessão 2 (atualização) remove o bloqueio IX na Página2 onde a linha do índice está originalmente localizada. Como a atualização alteraria o valor e, por sua vez, alteraria a posição da linha do índice dentro do índice, a sessão 2 também desejará remover outro bloqueio IX na página de destino onde a linha do índice terminará após a atualização.
Para entender o motivo pelo qual um select deseja manter o bloqueio S, consulte esta pergunta.
REPO