Digamos que eu tenha duas consultas, executadas em duas sessões separadas no SSMS:
Primeira sessão:
UPDATE Person
SET Name='Jonny', Surname='Cage'
WHERE Id=42
Segunda sessão:
SELECT Name, Surname
FROM Person WITH(NOLOCK)
WHERE Id > 30
É possível que a SELECT
instrução possa ler uma linha semi-atualizada, por exemplo, uma com Name = 'Jonny'
e Surname = 'Goody'
?
As consultas são executadas quase simultaneamente em sessões separadas.
Sim, o SQL Server pode, em algumas circunstâncias, ler o valor de uma coluna da versão "antiga" da linha e o valor de outra coluna da versão "nova" da linha.
Configurar:
Na primeira conexão, execute isto:
Na segunda conexão, execute isto:
Depois de correr por cerca de 30 segundos, recebo:
A
SELECT
consulta está recuperando as colunas dos índices não clusterizados em vez do índice clusterizado (embora devido às dicas).A declaração de atualização recebe um amplo plano de atualização ...
... e atualiza os índices em sequência para que seja possível ler valores "antes" de um índice e "depois" do outro.
Também é possível recuperar duas versões diferentes do mesmo valor de coluna.
Na primeira conexão, execute isto:
E então, no segundo, execute isto:
Imediatamente, isso retornou o seguinte resultado para mim