Leituras sujas, não repetíveis e fantasmas
As três anomalias de leitura e qual nível de isolamento impede cada uma.
Leituras sujas, não repetíveis e fantasmas é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.
As três anomalias de leitura
Os níveis de isolamento existem para evitar falhas específicas de concorrência chamadas anomalias de leitura. Os entrevistadores esperam que você defina as três com precisão e associe cada uma ao nível que a impede.
- Leitura suja - leitura de dados não confirmados
- Leitura não repetível - uma linha muda entre duas leituras
- Leitura fantasma - novas linhas aparecem entre duas leituras
O ponto mais difícil é distinguir a leitura não repetível da leitura fantasma, pois ambas envolvem executar a consulta novamente e obter resultados diferentes.
Leitura suja: definição
Uma leitura suja ocorre quando a transação T1 lê uma linha que a transação T2 modificou, mas ainda não confirmou. Se T2 fizer ROLLBACK, T1 terá agido com base em dados que nunca existiram de fato.
Somente READ UNCOMMITTED permite leituras sujas. Todos os níveis superiores as proíbem.
Perigo no mundo real: aprovar um empréstimo com base em um depósito que é revertido alguns segundos depois.
Leitura suja: linha do tempo
Leia as duas colunas como uma linha do tempo. T1 está sendo executada em READ UNCOMMITTED.
T1 vê o saldo 700, mas T2 nunca confirma a transação. O valor 700 era um fantasma do trabalho de T2 em andamento. Depois que T2 faz ROLLBACK, o valor real continua sendo 500. T1 tomou uma decisão com base em dados inválidos.
-- T2 (not committed) | -- T1 (READ UNCOMMITTED)
BEGIN; |
UPDATE accounts |
SET balance = 700 |
WHERE id = 1; |
| SELECT balance FROM accounts
| WHERE id = 1; -- reads 700 (dirty!)
ROLLBACK; |
| -- T1 acted on a value that never existedLeitura não repetível: definição
Uma leitura não repetível ocorre quando T1 lê uma linha, T2 confirma uma atualização ou exclusão nessa mesma linha, e T1 a lê novamente e vê um valor diferente.
Observe a diferença fundamental em relação a uma leitura suja: aqui, T2 confirmou a transação. Os dados são reais, mas mudaram sob T1 dentro de uma única transação.
READ COMMITTED ainda permite isso. REPEATABLE READ e os níveis superiores impedem o problema lendo a partir de um instantâneo estável.
Leitura não repetível: linha do tempo
T1 é executada em READ COMMITTED e lê a mesma linha duas vezes. Entre as leituras, T2 confirma uma alteração.
A mesma chave primária retorna dois valores diferentes dentro de uma única transação. Essa inconsistência pode interromper uma lógica de várias etapas que pressupõe que a linha permaneça estável.
-- T1 (READ COMMITTED) | -- T2
BEGIN; |
SELECT balance FROM accounts |
WHERE id = 1; -- 500 |
| BEGIN;
| UPDATE accounts SET balance = 900
| WHERE id = 1;
| COMMIT;
SELECT balance FROM accounts |
WHERE id = 1; -- 900 (changed!) |
COMMIT; |Leitura fantasma: definição
Uma leitura fantasma ocorre quando T1 executa uma consulta com uma condição de busca, T2 confirma um INSERT (ou DELETE) de linhas que correspondem a essa condição, e T1 executa a consulta novamente e vê um conjunto de linhas diferente.
A distinção em relação a uma leitura não repetível é a seguinte: uma leitura não repetível trata da mudança no valor de uma linha existente; uma leitura fantasma trata da mudança na quantidade de linhas que correspondem a um predicado.
Somente SERIALIZABLE tem, segundo o padrão, a garantia de impedir leituras fantasmas.
Leitura fantasma: linha do tempo
T1 conta duas vezes as contas de alto valor. Entre as contagens, T2 insere uma nova linha correspondente e confirma a transação.
Nenhuma linha existente mudou, mas o COUNT é diferente. A nova linha é o "fantasma" que apareceu no conjunto de resultados de T1.
-- T1 (REPEATABLE READ, standard) | -- T2
BEGIN; |
SELECT COUNT(*) FROM accounts |
WHERE balance > 1000; -- 3 |
| INSERT INTO accounts(id, balance)
| VALUES (99, 5000);
| COMMIT;
SELECT COUNT(*) FROM accounts |
WHERE balance > 1000; -- 4 (phantom)|
COMMIT; |Associando anomalias aos níveis
Essa associação é o ponto central do tema. O nível mais baixo que impede cada anomalia é:
- Leitura suja impedida a partir de
READ COMMITTED. - Leitura não repetível impedida a partir de
REPEATABLE READ. - Leitura fantasma impedida por
SERIALIZABLE(de acordo com o padrão).
Observe como os nomes se alinham: REPEATABLE READ torna as leituras repetíveis; os níveis recebem nomes relacionados à anomalia que passam a impedir.
Leitura não repetível vs. leitura fantasma: a distinção essencial
Esta é a confusão mais comum em entrevistas. Guarde esta frase:
Leitura não repetível = o valor de uma linha existente mudou. Leitura fantasma = o conjunto de linhas correspondentes mudou (linhas foram adicionadas ou removidas).
Teste seus conhecimentos: T2 executa UPDATE ... WHERE id = 5 e depois confirma, e T1 lê novamente a linha 5. Isso é uma leitura não repetível. T2 executa INSERT de uma nova linha correspondente ao WHERE de T1, e T1 executa a consulta novamente. Isso é uma leitura fantasma.
Assimetria de escrita: a anomalia bônus
Em entrevistas para cargos sênior, podem ir além das três anomalias padrão e abordar a assimetria de escrita: duas transações leem conjuntos parcialmente sobrepostos, fazem escritas distintas com base no que leram e ambas confirmam, deixando o banco em um estado que nenhuma delas teria permitido sozinha.
Exemplo clássico: dois médicos estão de plantão; cada um verifica se outro médico está de plantão e então sai do próprio turno. Ambos conseguem fazer isso, deixando a cobertura em zero.
O isolamento por instantâneo (Postgres REPEATABLE READ) permite assimetria de escrita; somente SERIALIZABLE a impede. Mencionar isso demonstra conhecimento aprofundado.
Atualização perdida: a quarta armadilha
Às vezes, os entrevistadores incluem a atualização perdida, que não faz parte da lista de anomalias do padrão, mas aparece constantemente na prática. Duas transações leem o mesmo valor, calculam um novo valor com base nele e gravam o resultado. A segunda gravação sobrescreve silenciosamente a primeira.
Exemplo: duas transferências leem o saldo 500, cada uma subtrai um valor e grava seu resultado. Uma das subtrações é perdida.
A solução não é apenas usar um nível de isolamento mais alto, mas também aplicar bloqueio explícito com SELECT ... FOR UPDATE ou usar uma atualização atômica que faça o cálculo no banco de dados, e não na aplicação.
-- Safe pattern: lock the row, or compute atomically
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE; -- locks row
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
-- Or simply: UPDATE accounts SET balance = balance - 100 WHERE id = 1;Verificação rápida
Identifique a anomalia com base em seu comportamento.
Recapitulação: anomalias e suas soluções
Três anomalias de leitura, cada uma corrigida por um nível de isolamento mais alto:
- Leitura suja (dados não confirmados) - corrigida em READ COMMITTED.
- Leitura não repetível (o valor de uma linha existente muda) - corrigida em REPEATABLE READ.
- Leitura fantasma (o conjunto de linhas correspondentes muda) - corrigida em SERIALIZABLE.
Não confunda a distinção essencial entre leitura não repetível e leitura fantasma e mencione a assimetria de escrita se o entrevistador quiser mais detalhes. Em seguida, veremos como os mecanismos realmente aplicam o isolamento: bloqueios, impasses e MVCC.
Perguntas Frequentes
A aula “Leituras sujas, não repetíveis e fantasmas” é grátis?
Sim — o texto completo de “Leituras sujas, não repetíveis e fantasmas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.
O que vou aprender em “Leituras sujas, não repetíveis e fantasmas”?
As três anomalias de leitura e qual nível de isolamento impede cada uma. Você pratica Coding Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Coding Interview Prep?
Nenhuma experiência prévia é necessária. Coding Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Leituras sujas, não repetíveis e fantasmas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Coding Interview Prep?
Sim. Cada aula de Coding Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Propriedades ACID explicadas
- Os quatro níveis de isolamento
- Leituras sujas, não repetíveis e fantasmas
- Deadlocks, bloqueios e MVCC