Eu acho que os níveis de isolamento acima são tão parecidos. Alguém poderia descrever com alguns exemplos bons qual é a principal diferença?
Eu acho que os níveis de isolamento acima são tão parecidos. Alguém poderia descrever com alguns exemplos bons qual é a principal diferença?
Respostas:
A leitura confirmada é um nível de isolamento que garante que qualquer leitura de dados foi confirmada no momento. Simplesmente restringe o leitor a ver qualquer leitura intermediária, não confirmada e "suja". Não há nenhuma promessa de que, se a transação reemitir a leitura, encontrará os mesmos dados, os dados poderão sofrer alterações após serem lidos.
A leitura repetida é um nível de isolamento mais alto, que, além das garantias do nível de leitura confirmada, também garante que qualquer leitura de dados não possa ser alterada . Se a transação ler os mesmos dados novamente, os dados lidos anteriormente serão mantidos inalterados e disponível 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 dado novo possa ser visto por uma leitura subsequente.
Digamos que você tenha uma tabela T com uma coluna C com uma linha, digamos que 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.
Se você seguir a lógica acima, poderá perceber rapidamente que as transações SERIALIZABLE, 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 System.Transactions
escopo .Net é serializável, e isso geralmente explica o desempenho péssimo resultante.
E, finalmente, há também o nível de isolamento do INSTANTÂNEO. O nível de isolamento do INSTANTÂNEO oferece as mesmas garantias que os serializáveis, mas não exigindo que nenhuma transação simultânea possa modificar os dados. Em vez disso, força todos os leitores a ver sua própria versão do mundo (é o próprio 'instantâneo'). Isso facilita muito a programação, além de ser muito escalável, pois não bloqueia atualizações simultâneas. No entanto, esse benefício tem um preço: consumo extra de recursos do servidor.
Leituras complementares:
O estado do banco de dados é mantido desde o início da transação. Se você recuperar um valor na sessão1, atualize esse valor na sessão2, recuperando-o novamente na sessão1 retornará os mesmos resultados. As leituras são repetíveis.
session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron
No contexto de uma transação, você sempre recuperará o valor confirmado mais recentemente. Se você recuperar um valor na sessão1, atualizá-lo na sessão2 e recuperá-lo na sessão1 novamente, você obterá o valor modificado na sessão2. Ele lê a última linha confirmada.
session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;
session1> SELECT firstname FROM names WHERE id = 7;
Bob
Faz sentido?
Simplesmente a resposta de acordo com a minha leitura e compreensão para este tópico e a resposta @ remus-rusanu é baseada neste cenário simples:
Existem dois processos A e B. O processo B está lendo a Tabela X O processo A está escrevendo na tabela X O processo B está lendo novamente a Tabela X.
Pergunta antiga que já tem uma resposta aceita, mas eu gosto de pensar nesses dois níveis de isolamento em termos de como eles alteram o comportamento de bloqueio no SQL Server. Isso pode ser útil para aqueles que estão depurando impasses como eu.
LER COMPROMISSO (padrão)
Bloqueios compartilhados são obtidos no SELECT e liberados quando a instrução SELECT é concluída . É assim que o sistema pode garantir que não haja leituras sujas de dados não confirmados. Outras transações ainda podem alterar as linhas subjacentes após a conclusão de seu SELECT e antes de sua transação.
LEITURA REPETÍVEL
Os bloqueios compartilhados são obtidos no SELECT e liberados somente após a transação ser concluída . É assim que o sistema pode garantir que os valores que você lê não sejam alterados durante a transação (porque permanecem bloqueados até que a transação seja concluída).
Tentando explicar essa dúvida com diagramas simples.
Leitura confirmada : aqui neste nível de isolamento, a transação T1 estará lendo o valor atualizado do X confirmado pela transação T2.
Leitura Repetível: Nesse nível de isolamento, a Transação T1 não considerará as alterações confirmadas pela Transação T2.
Penso que esta imagem também pode ser útil, ajuda-me como referência quando quero recordar rapidamente as diferenças entre os níveis de isolamento (graças a kudvenkat no youtube)
Por favor note que, a repetível no que diz respeito leitura repetida para uma tupla, mas não para a tabela inteira. Nos níveis de isolamento do ANSC, pode ocorrer anomalia na leitura fantasma , o que significa que ler uma tabela com a mesma cláusula where duas vezes pode retornar diferentes retornos e diferentes conjuntos de resultados. Literalmente, não é repetível .
Minha observação sobre a solução inicial aceita.
Sob RR (padrão mysql) - Se um tx estiver aberto e um SELECT for acionado, outro tx NÃO poderá excluir nenhuma linha pertencente ao conjunto de resultados READ anteriores até que o tx anterior seja confirmado (na verdade, a instrução de exclusão no novo tx será interrompida) , no entanto, a próxima TX pode excluir todas as linhas da tabela sem nenhum problema. Btw, uma próxima leitura no TX anterior ainda verá os dados antigos até que sejam confirmados.