INSTANTÂNEO LIDO COMPRIDO DO SQL Server vs INSTANTÂNEO


23

Eu estava pesquisando as diferenças entre os níveis do SQL Server READ COMMITTED SNAPSHOTe de SNAPSHOTisolamento 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, recomenda-se o isolamento de leitura confirmada usando controle de versão de linha em vez do isolamento de captura instantânea pelos seguintes motivos:

  • Consome menos espaço tempdb do que o isolamento da captura instantânea.

  • O isolamento de captura instantânea é vulnerável a conflitos de atualização que não são aplicáveis ​​à leitura de isolamento confirmado usando controle de versão de linha. Quando uma transação em execução sob isolamento de captura instantânea lê dados que são modificados por outra transação, uma atualização da transação de captura instantânea nos mesmos dados causa um conflito de atualização e a transação é encerrada e revertida. Esse não é um problema com o isolamento confirmado pela leitura usando o controle de versão de linha.

Sou um pouco novo nesses tópicos, mas não consigo entender os dois pontos do link acima.

  1. Por que o espaço tempdb seria diferente para esses modos? Um armazena versões mais granulares que o outro?

  2. Por que o isolamento de instantâneo é mais vulnerável a conflitos de atualização?

Respostas:


18
  1. READ COMMITTED SNAPSHOTusa 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 nos documentos é um pouco enganadora, porque sugere que isso sempre é verdade - é verdade apenas no caso de SNAPSHOTtransações de longa execução .) Versões de linha de instantâneo são criadas nas gravações. As leituras não influenciam o que é colocado no tempdb. Os escritores não podem prever o que as leituras serão realizadas no futuro. Os leitores influenciam apenas o que pode ser removido.
  2. Quando uma SNAPSHOTtransação T1grava em uma linha que foi modificada por outra transação T2no tempo entre o T1início e a T1tentativa de gravação, a instrução falha com um erro de conflito de atualização. Este é um modelo de concorrência otimista. Com READ COMMITTED SNAPSHOT T1esperaria para T2liberar o bloqueio X na linha e continuar normalmente.

1
Para o número 2, é seguro dizer que o SNAPSHOT não bloqueia exclusivamente para atualizações - apenas depende do controle de versão de linha?
John Russell

1
@JohnRussell, ele bloqueia exclusivamente para dar suporte à reversão. Todas as gravações devem travar em X para garantir que a linha possa ser restaurada em caso de reversão.
usr

0

Mais uma diferença entre o instantâneo e o instantâneo confirmado de leitura é o seguinte.

  1. Instantâneo

Na primeira sessão

CONFIGURAR O INSTANTÂNEO DO NÍVEL DE ISOLAMENTO DE TRAN COMEÇAR TRAN SELECT * FROM TB1 ..... .....

Na segunda sessão

Atualizar TB1 SET NAME = NAME + 'test' Onde id = 1

Na primeira sessão

SELECT * FROM TB1 - ISTO retornará o nome do valor para ID = 1, não nome + 'teste' COMMIT TRAN

No instantâneo confirmado de leitura, a primeira seleção na sessão 1 retornará o nome para id = 1 e a segunda seleção retornará o nome + 'test'.

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 todas as instruções SELECT durante a transação.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.