Escolhendo níveis de isolamento baseados em controle de versão de linha
Níveis de isolamento com base em controle de versão de linha melhoram a simultaneidade de leitura eliminando bloqueios para operações de leitura. O MicrosoftSQL Server apresenta dois níveis de isolamento da transação que usam controle de versão de linha:
Uma nova implementação de isolamento da leitura confirmada que usa o controle de versão quando a opção de banco de dados READ_COMMITTED_SNAPSHOT for ON.
Um novo nível de isolamento, instantâneo, habilitado quando a opção de banco de dados ALLOW_SNAPSHOT_ISOLATION for ON.
Para a maioria dos aplicativos, o isolamento de leitura confirmada usando controle de versão de linha é recomendado em vez do isolamento de instantâneo, pelas seguintes razões:
Consome menos espaço tempdb que o isolamento do instantâneo.
Funciona com transações distribuídas, enquanto o isolamento do instantâneo não.
Trabalha com a maioria dos aplicativos existentes sem requerer qualquer mudança. Os aplicativos escritos que usam o nível de isolamento padrão e a leitura confirmada podem ser ajustados dinamicamente. O comportamento de leitura confirmada, para usar ou não o controle de versão de linha, é determinado pela configuração da opção do banco de dados e isto pode ser alterado sem afetar o aplicativo.
Observação Para aplicativos que são planejados para depender do comportamento de bloqueio do isolamento de leitura confirmada, os desenvolvedores podem querer alterar o aplicativo para funcionar com ambos os modos de isolamento de leitura confirmada. Caso contrário é importante observar que a opção do banco de dados READ_COMMITTED_SNAPSHOT permaneça em OFF.
O isolamento do instantâneo é vulnerável para atualizar conflitos que não são aplicáveis a isolamento de leitura confirmada usando o controle de versão de linha. Quando uma transação em execução sob o isolamento do instantâneo lê dados modificados por outra transação, uma atualização pela transação do instantâneo nos mesmos dados causa um conflito de atualização e a transação é encerrada e revertida. Isso não é um problema com isolamento de leitura confirmada que usa controle de versão de linha.
Quando usar o isolamento de leitura confirmada usando controle de versão de linha
O isolamento de leitura confirmada que usa controle de versão de linha fornece uma consistência de leitura em nível de instrução. Como cada instrução dentro da transação é executada, um novo instantâneo de dados é tirado e permanece consistente para cada instrução até que a instrução termine a execução. Habilita o isolamento de leitura confirmada usando controle de versão de linha
O bloqueio de leitor/gravador ocorre quando os benefícios da simultaneidade ultrapassam a sobrecarga aumentada da criação e gerenciamento de versões de linha.
Um aplicativo requer exatidão absoluta para agregações demoradas ou consultas onde valores de dados devem ser consistentes exatamente na hora do início de uma consulta.
Quando usar o isolamento do instantâneo
O isolamento do instantâneo fornece consistência de leitura em nível da transação. Um instantâneo de dados é tirado quando a transação do instantâneo inicia, e permanece consistente durante toda a transação. Use o isolamento do instantâneo quando:
O controle de simultaneidade otimista é desejado.
Existe baixa probabilidade de uma transação precisar ser revertida devido a um conflito de atualização.
Um aplicativo precisa gerar relatórios com base em consultas demoradas de várias instruções que precisam ter consistência point-in-time. O isolamento do instantâneo fornece o benefício de leituras repetíveis (consulte Efeitos de simultaneidade) sem usar bloqueios compartilhados. Instantâneo do banco de dados pode fornecer uma funcionalidade similar, mas deve ser implementado manualmente. Isolamento do instantâneo fornece automaticamente as últimas informações no banco de dados para cada transação de isolamento de instantâneo.
Benefícios dos níveis de isolamento com base em controle de versão de linha
Os níveis de isolamento que usam controle de versão de linha fornecem estes benefícios:
Operações de leitura recuperam um instantâneo consistente do banco de dados.
Instruções SELECT não bloqueiam dados durante uma operação de leitura (os leitores não bloqueiam os gravadores e vice-versa).
Instruções SELECT podem acessar o último valor confirmado da linha, enquanto outras transações estão atualizando a linha sem serem bloqueadas.
O número de deadlocks é reduzido.
O número de bloqueios exigido por uma transação é reduzido, o que reduz a sobrecarga do sistema requerido para o gerenciamento de bloqueios.
Ocorrem menos escalações de bloqueio.
Custos dos níveis de isolamento com base em controle de versão de linha
Decidir usar o isolamento com base em controle de versão de linha requer considerar o benefício de simultaneidade de minimizar o bloqueio contra o uso aumentado de recurso necessário para manter e ler versões de linha. Considere os custos seguintes associados com a habilitação do controle de versão de linha para os níveis de isolamento de instantâneo e de leitura confirmada:
O desempenho de leitura pode ser afetado quando as versões necessárias por consultas ficam antigas e longas cadeias de versão precisam ser verificadas.
O controle de versão de linha aumenta o uso de recurso durante a modificação de dados, pois as versões de linha são mantidas em tempdb.
Quando as opções de banco de dados READ_COMMITTED_SNAPSHOT ou ALLOW_SNAPSHOT_ISOLATION estão ON, transações de atualização e exclusão de um banco de dados particular devem manter versões de linhas, mesmo quando não houver transações que usam um nível de isolamento com base em controle de versão de linha. Construir um instantâneo consistente de dados usando versões de linha envolve recursos do sistema (CPU e memória) e potencialmente gera atividade de E/S. Como as versões de registro são armazenadas em tempdb, o desempenho é melhor e o número de E/S emitidos é inferior quando mais páginas tempdb podem ser armazenadas na memória para o controle de versão de linha.
Observação Inserir uma linha geralmente não gera uma versão de linha. Sob certas condições, porém, o comando INSERT gera uma versão de linha. Por exemplo, se você inserir uma linha em uma tabela com um índice exclusivo quando uma versão de linha (registro fantasma) anteriormente excluída não for truncada, o comando INSERT gerará uma versão de linha.
tempdb deve ter espaço em disco suficiente para o armazenamento da versão. Se houver transações muito demoradas, todas as versões geradas por transações de atualização durante esse tempo deverão ser mantidas em tempdb. Se tempdb ficar com espaço insuficiente, as operações de atualização não falham, mas as operações de leitura usando controle de versão de linha podem falhar.
As informações sobre controle de versão de linha requerem 14 bytes adicionados à linha do banco de dados.
O desempenho de atualização pode ser mais lento devido ao trabalho envolvido na manutenção das versões de linha. Em típicas cargas de trabalho OLTP, cada atualização altera somente algumas linhas em um banco de dados. Nestes sistemas, o desempenho para atualizações em um banco de dados onde as opções estão em ON pode ser somente alguns pontos percentuais mais lentos, comparado a bancos de dados com ambas as opções em OFF. O custo de desempenho de atualizações com controle de versão pode ser mais elevado quando maiores quantidades de dados são alteradas durante as operações de atualização.
Leitores de dados enfrentam o custo extra de desviar da lista de vínculo de versão. Quanto mais antigo o instantâneo for, mais lento se torna o processo de acessá-lo em uma transação de isolamento de instantâneo.
Algumas transações de atualização que usam isolamento de instantâneo podem precisar ser revertidas devido à detecção obrigatória de conflito das operações de atualização. As transações que estão sendo executadas sob isolamento de leitura confirmada que usam controle de versão de linha não geram conflitos de atualização.
As transações que usam controle de versão de linha têm outras limitações. Para obter mais informações, consulte Usando níveis de isolamento com base em controle de versão de linha.
Sistemas que se beneficiam de níveis de isolamento com base em controle de versão de linha
Os cenários que se beneficiam de níveis de isolamento com base em controle de versão de linha incluem:
Os sistemas onde os relatórios somente de leitura e consultas ad hoc executadas em paralelo com um aplicativo que está atualizando os dados.
A migração do aplicativo para o MicrosoftMecanismo de Banco de Dados do SQL Server de outros sistemas de banco de dados relacional suportando níveis de isolamento similares.
Os sistemas onde adquirir agregados consistentes, como AVG, COUNT e SUM ou executar interseções de índice e junções de índice, requerem um nível estrito de isolamento (como leitura repetível ou serializável).
Sistemas que têm um número alto de deadlocks devido à contenção de leitura/gravação.
Consulte também