A maioria dos fóruns e exemplos online sempre sugere ter os dois ALLOW_SNAPSHOT_ISOLATION
e READ_COMMITTED_SNAPSHOT
ativá-los sempre que alguém fizer uma captura instantânea, versão de linha ou pergunta semelhante.
Eu acho que a palavra INSTANTÂNEO nas duas configurações fica um pouco confusa. Eu pensei que, para que o mecanismo de banco de dados usasse o controle de versão de linha em vez de bloqueios para o comportamento padrão READ_COMMITTED, o banco de dados READ_COMMITTED_SNAPSHOT
está definido como ON, independentemente da ALLOW_SNAPSHOT_ISOLATION
configuração.
A ALLOW_SNAPSHOT_ISOLATION
configuração é configurada como ON apenas para permitir o isolamento de instantâneo ao iniciar uma transação (por exemplo, INSTANTÂNEO DE CONFIGURAÇÃO DO NÍVEL DE ISOLAÇÃO DA TRANSAÇÃO), independentemente da READ_COMMITTED_SNAPSHOT
configuração.
O único motivo para ter essas duas configurações definidas como ON é quando ele precisa ter o controle de versão de linha READ COMMITTED E o isolamento de captura instantânea.
Minha pergunta é: meu entendimento está incorreto de alguma forma? E que essas duas configurações sempre devem estar ativadas juntas (especialmente para versão de linha READ COMMITTED)?
OK, voltei para casa e testei. Aqui está a observação.
Primeiro teste com as duas configurações confirmadas como OFF.
Consulta 1
Consulta 2
Nesse teste, a consulta 2 está aguardando a confirmação da consulta 1, dm_tran_locks DMV mostra esse bloqueio exclusivo na TABLE1 incorrido pela consulta 1.
Segundo teste , reversão da transação anterior, defina READ_COMMITTED_SNAPSHOT ON, mas deixe ALLOW_SNAPSHOT_ISOLATION OFF.
Execute a Consulta 1 e execute a consulta 2. O DMV mostra a consulta 1 com bloqueio exclusivo, mas a consulta 2 retorna detalhes com 'Original' sem a consulta 1 confirmar a transação. Parece que o controle de versão da linha READ_COMMITTED está em vigor.
Adicionar
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
a consulta 1 e a consulta 2 e executar a consulta 1 ou a consulta 2 retorna erro - A transação de isolamento de captura instantânea falhou ao acessar o banco de dados 'TEST' porque o isolamento de captura instantânea não é permitido nesse banco de dados. Use ALTER DATABASE para permitir o isolamento de instantâneo.Terceiro teste , reversão da transação anterior. Ative READ_COMMITTED_SNAPSHOT e ALLOW_SNAPSHOT_ISOLATION.
Execute a consulta 1 e, em seguida, a consulta 2. O DMV mostra o bloqueio exclusivo incorrido pela consulta 1. A consulta 2 parece estar aguardando a conclusão da consulta 1. Ativar ALLOW_SNAPSHOT_ISOLATION ON não parece ativar o controle de versão READ COMMITTED.
Adicionando
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
à consulta 1 e à consulta 2. Execute a consulta 1 e, em seguida, a consulta 2. Enquanto o DMV mostra a consulta 1 com bloqueio exclusivo, a consulta 2 retorna os detalhes com 'Original'. O isolamento de instantâneo parece estar no lugar.A observação do teste mostra que
READ_COMMITTED_SNAPSHOT
ela própria ativa / desativa o controle de versão da linha READ COMMITTED independentemente daALLOW_SNAPSHOT_ISOLATION
configuração e vice-versa.fonte
Sua compreensão está correta. Eu gosto da definição curta, limpa e simples daqui :
Parece que muitos mal-entendidos vêm do próprio MS. Por exemplo, aqui eles dizem:
Mas o "isolamento de captura instantânea" mencionado não é igual ao comportamento da transação ao qual
set transaction isolation level snapshot
é aplicado.Quanto à diferença, uma boa explicação está aqui .
Provavelmente seria melhor se READ_COMMITTED_SNAPSHOT fosse nomeado como READ_COMMITTED_ROW_VERSIONING ou algo assim. :)
fonte
Eu gosto deste resumo da Microsoft :
fonte