Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Diferença entre leitura confirmada e leitura repetível


A leitura confirmada é um nível de isolamento que garante que qualquer leitura de dados foi confirmada no momento é lido. Ele simplesmente restringe o leitor de ver qualquer leitura intermediária, não comprometida e 'suja'. Não faz nenhuma promessa de que, se a transação reemitir a leitura, encontrará o Mesmo dados, os dados são livres para serem alterados depois de lidos.

A leitura repetível é um nível de isolamento mais alto, que além das garantias do nível de leitura confirmada, também garante que qualquer dado lido não pode ser alterado , se a transação ler os mesmos dados novamente, ela encontrará os dados lidos anteriormente no lugar, inalterados e disponíveis para leitura.

O próximo nível de isolamento, serializável, oferece uma garantia ainda mais forte:além de todas as garantias de leitura repetível, também garante que nenhum novo dados pode ser visto por uma leitura posterior.

Digamos que você tenha uma tabela T com uma coluna C com uma linha, digamos que ela tenha o valor '1'. E considere que você tem uma tarefa simples como a seguinte:
BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

Essa é uma tarefa simples que emite duas leituras da tabela T, com um atraso de 1 minuto entre elas.
  • em READ COMMITTED, o segundo SELECT pode retornar qualquer dados. Uma transação concorrente pode atualizar o registro, excluí-lo, inserir novos registros. A segunda seleção sempre verá o novo dados.
  • em REPEATABLE READ o segundo SELECT é garantido para exibir pelo menos as linhas que foram retornadas do primeiro SELECT inalterado . Novas linhas podem ser adicionadas por uma transação simultânea nesse minuto, mas as linhas existentes não podem ser excluídas nem alteradas.
  • em SERIALIZABLE lê a segunda seleção é garantido para ver exatamente as mesmas linhas que a primeira. Nenhuma linha pode ser alterada, nem excluída, nem novas linhas podem ser inseridas por uma transação simultânea.

Se você seguir a lógica acima, poderá perceber rapidamente que as transações SERIALIZÁVEIS, embora possam facilitar a sua vida, estão sempre bloqueando completamente todas as operações simultâneas possíveis, pois exigem que ninguém possa modificar, excluir ou inserir nenhuma linha. O nível de isolamento de transação padrão do .Net System.Transactions escopo é serializável, e isso geralmente explica o desempenho abismal que resulta.

E, finalmente, há também o nível de isolamento SNAPSHOT. O nível de isolamento SNAPSHOT oferece as mesmas garantias que serializável, mas não exigindo que nenhuma transação simultânea possa modificar os dados. Em vez disso, força cada leitor a ver sua própria versão do mundo (é seu próprio 'instantâneo'). Isso torna muito fácil de programar e muito escalável, pois não bloqueia atualizações simultâneas. No entanto, esse benefício vem com um preço:consumo extra de recursos do servidor.

Leituras complementares:
  • Níveis de isolamento no mecanismo de banco de dados
  • Efeitos de simultaneidade
  • Escolhendo níveis de isolamento baseados em controle de versão de linha