Eu estava pesquisando as diferenças entre o SQL Server READ COMMITTED SNAPSHOT
e os SNAPSHOT
níveis de isolamento e me deparei com o seguinte recurso:
Escolhendo níveis de isolamento baseados em controle de versão de linha
Para a maioria dos aplicativos, o isolamento de confirmação de leitura usando controle de versão de linha é recomendado em vez do isolamento de instantâneo pelos seguintes motivos:
Ele consome menos espaço tempdb do que o isolamento de instantâneo.
O isolamento de instantâneo é vulnerável a conflitos de atualização que não são aplicáveis ao isolamento confirmado de leitura usando controle de versão de linha. Quando uma transação executada sob isolamento de instantâneo lê dados que são modificados por outra transação, uma atualização da transação de instantâneo para os mesmos dados causa um conflito de atualização e a transação é encerrada e revertida. Isso não é um problema com isolamento de confirmação de leitura usando controle de versão de linha.
Sou um pouco novo nesses tópicos, mas não consigo entender os dois pontos do link acima.
Por que o espaço tempdb seria diferente para esses modos? Um armazena versões mais granulares do que o outro?
Por que o isolamento de instantâneo é mais vulnerável a conflitos de atualização?
READ COMMITTED SNAPSHOT
usa um novo instantâneo após cada instrução. Isso significa que menos versões de linha estão sendo mantidas vivas. (A declaração que você citou dos documentos é um pouco enganosa porque sugere que isso é sempre verdade - só é verdade no caso deSNAPSHOT
transações de execução longa.) Versões de linha de instantâneo são criadas em gravações. As leituras não influenciam o que é colocado no tempdb. Os escritores não podem prever quais leituras serão realizadas no futuro. Os leitores influenciam apenas o que pode ser expurgado.SNAPSHOT
transaçãoT1
grava em uma linha que foi modificada por outra transaçãoT2
no tempo entre oT1
início eT1
a tentativa de gravação, a instrução falha com um erro de conflito de atualização. Este é um modelo de simultaneidade otimista. ComREAD COMMITTED
SNAPSHOT
T1
esperariaT2
liberar o X-lock na linha e continuaria normalmente.Mais uma diferença entre instantâneo e instantâneo de leitura confirmada é a seguinte.
Na primeira sessão
AJUSTE O INSTANTÂNEO DO NÍVEL DE ISOLAMENTO DE TRAN COMECE A SELEÇÃO DE TRAN * DE TB1 ..... .....
Na segunda sessão
Atualização TB1 SET NAME = NAME + 'test' Onde id = 1
Na primeira sessão
SELECT * FROM TB1 -- ISSO IRÁ retornar o valor name para ID = 1, não name + 'test' COMMIT TRAN
No instantâneo de leitura confirmada, a primeira seleção na sessão 1 retornará o nome para id = 1 e a segunda seleção retornará o nome + 'teste'.
Portanto, no isolamento de instantâneo, o SQL SERVER faz um instantâneo no início da transação e lê esse instantâneo durante toda a transação.
No instantâneo confirmado de leitura, o instantâneo é obtido para cada instrução SELECT durante a transação.