Níveis de Isolamento
Os níveis de isolamento definem o quanto uma transação é protegida dos efeitos de outras transações concorrentes, trocando algumas garantias de isolamento por maior concorrência e throughput.
Definition
Um nível de isolamento é uma especificação de quais anomalias de concorrência uma transação pode observar; níveis mais altos previnem mais anomalias (até a serializabilidade completa) ao custo de concorrência reduzida, enquanto níveis mais baixos permitem certas anomalias em troca de desempenho.
Scope
Este tópico aborda os níveis de isolamento padrão — leitura não confirmada (read uncommitted), leitura confirmada (read committed), leitura repetível (repeatable read) e serializável (serializable) — definidos em termos dos fenômenos (leitura suja, leitura não repetível, fantasma) que cada um permite ou previne, a crítica influente que os reformulou em termos de anomalias permitidas, e o isolamento de snapshot (snapshot isolation) praticamente importante e suas anomalias, como o desvio de escrita (write skew). Ele trata do trade-off entre consistência e concorrência. Exclui os mecanismos subjacentes de bloqueio e multiversão que implementam esses níveis.
Core questions
- Quais anomalias — leitura suja, leitura não repetível, fantasma — cada nível de isolamento permite?
- Como o padrão SQL define os quatro níveis de isolamento?
- Por que os pesquisadores criticaram as definições baseadas em anomalias como ambíguas?
- Onde o isolamento de snapshot se encaixa, e quais anomalias (como o desvio de escrita) ele pode permitir?
- Como as aplicações escolhem um nível de isolamento para uma determinada carga de trabalho?
Key concepts
- leitura não confirmada
- leitura confirmada
- leitura repetível
- serializável
- leitura suja
- leitura não repetível
- leitura fantasma
- isolamento de snapshot e desvio de escrita
Key theories
- Níveis de isolamento baseados em anomalias
- O padrão SQL define os níveis de isolamento por quais dos três fenômenos — leituras sujas, leituras não repetíveis e fantasmas — eles permitem, variando de leitura não confirmada (todos permitidos) a serializável (nenhum permitido).
- Crítica aos níveis de isolamento ANSI
- Berenson e colegas mostraram que as definições baseadas em fenômenos do padrão são ambíguas e não caracterizam claramente os sistemas multiversão, e eles introduziram o isolamento de snapshot como um nível distinto e amplamente implementado, não capturado pelas definições originais.
- Isolamento de snapshot e suas anomalias
- Sob o isolamento de snapshot, cada transação lê um snapshot consistente a partir do seu início, proporcionando um forte comportamento de leitura sem bloqueios de leitura, mas pode permitir anomalias não serializáveis, como o desvio de escrita, motivando o isolamento de snapshot serializável.
Clinical relevance
O nível de isolamento é uma escolha de configuração rotineira, mas consequente, para desenvolvedores de aplicativos: escolher um nível muito fraco pode corromper dados silenciosamente através de anomalias sutis, enquanto usar sempre o serializável pode estrangular o throughput, portanto, entender os níveis é essencial para aplicações transacionais corretas e de alto desempenho.
History
O padrão ANSI/ISO SQL definiu os níveis de isolamento em termos de fenômenos permitidos. A crítica de 1995 de Berenson, Bernstein, Gray e os O'Neils expôs ambiguidades nessas definições e caracterizou o isolamento de snapshot, que os bancos de dados multiversão convencionais adotaram. Trabalhos posteriores definiram o isolamento de snapshot serializável para fechar a lacuna de anomalias restante.
Debates
- Definindo o isolamento por anomalias versus por serializabilidade
- As definições da lista de anomalias do padrão são fáceis de declarar, mas ambíguas e não se encaixam em sistemas multiversão; uma alternativa é definir a correção diretamente via serializabilidade, o que é mais limpo, mas mais difícil de mapear para os níveis que os desenvolvedores configuram na prática.
Key figures
- Jim Gray
- Philip Bernstein
- Hal Berenson
Related topics
Seminal works
- berenson1995
- gray1992
Frequently asked questions
- Qual a diferença entre uma leitura não repetível e uma leitura fantasma?
- Uma leitura não repetível ocorre quando uma transação lê a mesma linha duas vezes e vê valores diferentes porque outra transação a atualizou no meio. Uma leitura fantasma ocorre quando uma transação executa novamente uma consulta com uma condição de busca e vê novas linhas que outra transação inseriu. A leitura repetível previne a primeira; apenas o serializável previne fantasmas de forma confiável.
- O isolamento de snapshot é o mesmo que serializável?
- Não. O isolamento de snapshot oferece a cada transação um snapshot consistente e previne leituras sujas e não repetíveis, mas não é totalmente serializável: ele permite anomalias de desvio de escrita, onde duas transações leem dados sobrepostos e fazem atualizações disjuntas que, juntas, violam uma restrição. O isolamento de snapshot serializável o estende para eliminar tais anomalias.