0Pricing
SQL Interview Prep · Aula

Os quatro níveis de isolamento

De Read Uncommitted a Serializable e o que cada nível permite.

Os quatro níveis de isolamento é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 2 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 SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.

A pergunta por trás da pergunta

Quando um entrevistador pede para "nomear os quatro níveis de isolamento", o verdadeiro teste é saber explicar o compromisso: um isolamento mais forte significa menos anomalias, mas menor concorrência.

O padrão SQL define quatro níveis, ordenados do mais fraco ao mais forte:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

Cada nível permite ou proíbe um conjunto específico de anomalias de leitura. Esta lição aborda os níveis; a próxima detalha as anomalias.

Definindo o nível de isolamento

Você define o isolamento por transação ou por sessão. A sintaxe é praticamente idêntica entre os mecanismos.

Se você não o definir, todo banco de dados terá um padrão. Conhecer os padrões é uma pergunta frequente em entrevistas, por isso os abordaremos no final.

-- Per transaction (standard SQL)
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- ... statements ...
COMMIT;

-- Per session
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Nível 1: READ UNCOMMITTED

READ UNCOMMITTED é o nível mais fraco. Uma transação pode ler linhas que outra transação alterou, mas ainda não confirmou. Essas leituras são chamadas de leituras sujas.

Se essa outra transação for revertida, você terá lido dados que nunca existiram oficialmente. Isso é perigoso para qualquer operação que precise estar correta.

Observação: o PostgreSQL trata READ UNCOMMITTED da mesma forma que READ COMMITTED, portanto nunca realiza leituras sujas de fato. O SQL Server e o MySQL respeitam esse nível.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN;
-- may see another transaction's uncommitted (dirty) rows
SELECT balance FROM accounts WHERE id = 1;
COMMIT;

Nível 2: READ COMMITTED

READ COMMITTED garante que você sempre leia apenas dados que foram confirmados. Não há leituras sujas.

No entanto, cada instrução vê o instantâneo confirmado mais recente. Se você executar a mesma consulta duas vezes em uma transação, outra transação confirmada nesse intervalo poderá alterar o resultado. Essa anomalia é uma leitura não repetível.

Este é o padrão no PostgreSQL, no Oracle e no SQL Server, além de ser um equilíbrio sensato para a maioria das aplicações.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- returns 500
-- another transaction commits an update to id = 1
SELECT balance FROM accounts WHERE id = 1;  -- may now return 700
COMMIT;

Nível 3: REPEATABLE READ

REPEATABLE READ garante que, se você ler uma linha duas vezes na mesma transação, obterá o mesmo valor nas duas ocasiões. Ele cria um instantâneo consistente no início da transação.

Esse nível impede leituras sujas e leituras não repetíveis. O padrão ainda permite leituras fantasmas: novas linhas que correspondem à sua cláusula WHERE e aparecem quando a consulta é repetida.

Importante: este é o padrão no MySQL/InnoDB, e a implementação do InnoDB também bloqueia a maioria das leituras fantasmas por meio de bloqueios de próxima chave.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- 500
-- another transaction commits a change to id = 1
SELECT balance FROM accounts WHERE id = 1;  -- still 500 in this txn
COMMIT;

Nível 4: SERIALIZABLE

SERIALIZABLE é o nível mais rigoroso. O banco de dados garante que o resultado da execução concorrente de transações seja idêntico ao da execução dessas transações uma após a outra, em alguma ordem serial.

Ele impede leituras sujas, leituras não repetíveis e leituras fantasmas. O custo é maior: mais bloqueios ou, no PostgreSQL, abortos por falha de serialização que precisam ser repetidos.

Formulação para entrevista: "SERIALIZABLE dá a ilusão de que cada transação foi executada sozinha, ao custo de menor concorrência e possíveis novas tentativas."

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT SUM(balance) FROM accounts;
INSERT INTO audit (total) VALUES (...);
COMMIT;  -- may raise a serialization_failure you retry

A matriz de anomalias

A informação mais útil para memorizar é qual anomalia cada nível permite. "Sim" significa que a anomalia pode ocorrer.

  • READ UNCOMMITTED: suja=Sim, não repetível=Sim, fantasma=Sim
  • READ COMMITTED: suja=Não, não repetível=Sim, fantasma=Sim
  • REPEATABLE READ: suja=Não, não repetível=Não, fantasma=Sim (segundo o padrão)
  • SERIALIZABLE: suja=Não, não repetível=Não, fantasma=Não

Cada nível acima impede mais uma anomalia. Essa progressão é a resposta completa.

Padrão versus implementações reais

Uma distinção importante para entrevistas avançadas: o padrão SQL define os níveis pelas anomalias que eles devem impedir, não pela forma como fazem isso. Os mecanismos reais costumam impedir mais anomalias.

  • REPEATABLE READ do PostgreSQL usa isolamento por instantâneo e também bloqueia leituras fantasmas, embora ainda possa ocorrer uma anomalia de escrita enviesada.
  • REPEATABLE READ do MySQL/InnoDB bloqueia leituras fantasmas com bloqueios de próxima chave.
  • SERIALIZABLE do PostgreSQL usa SSI (isolamento serializável por instantâneo), abortando em caso de conflito em vez de usar bloqueios pesados.

Mencionar isso mostra que você sabe que o padrão é um requisito mínimo, não o comportamento exato.

Níveis padrão por mecanismo

Os padrões aparecem constantemente. Memorize-os:

  • PostgreSQL: READ COMMITTED
  • Oracle: READ COMMITTED (nunca há leituras sujas)
  • SQL Server: READ COMMITTED
  • MySQL (InnoDB): REPEATABLE READ

A exceção do MySQL é uma pegadinha frequente. Se perguntarem "qual é o nível de isolamento padrão?", esclareça primeiro qual é o mecanismo.

Escolhendo um nível na prática

Como decidir? Enquadre a escolha como uma relação entre risco e capacidade de processamento.

  • Use READ COMMITTED para OLTP típico; ele é rápido e evita leituras sujas.
  • Use REPEATABLE READ quando uma transação lê os mesmos dados várias vezes e precisa mantê-los estáveis (relatórios e cálculos em várias etapas).
  • Use SERIALIZABLE para uma lógica crítica para a correção, em que nenhuma anomalia é aceitável, e crie uma lógica de repetição para os abortos.

Quase nunca use READ UNCOMMITTED em produção.

Perguntas comuns de acompanhamento

Depois que você listar os níveis, os entrevistadores farão perguntas rápidas de acompanhamento. Tenha respostas objetivas prontas:

  • "Qual nível impede leituras sujas, mas permite leituras não repetíveis?" READ COMMITTED.
  • "Qual é a única anomalia que REPEATABLE READ ainda permite segundo o padrão?" Leituras fantasmas.
  • "Por que não usar sempre SERIALIZABLE?" Ele reduz a concorrência e pode exigir novas tentativas de transação em caso de falhas de serialização.
  • "Um nível mais alto custa mais?" Sim, por causa dos bloqueios ou do custo adicional de abortar e repetir.

Responder a essas perguntas instantaneamente prova que a escala foi assimilada, não apenas decorada.

Verificação rápida

Este é um dos fatos sobre níveis padrão mais cobrados em avaliações.

Recapitulação: quatro níveis, um compromisso

Os quatro níveis de isolamento formam uma escala do mais fraco ao mais forte: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE. Cada nível acima impede mais uma anomalia (suja, não repetível ou fantasma), ao custo de concorrência.

Lembre-se dos padrões (READ COMMITTED em todos os mecanismos, exceto REPEATABLE READ no MySQL) e observe que os mecanismos reais costumam impedir mais anomalias do que o padrão exige. Em seguida, examinaremos as três anomalias de leitura que esses níveis foram projetados para impedir.

Perguntas Frequentes

A aula “Os quatro níveis de isolamento” é grátis?

Sim — o texto completo de “Os quatro níveis de isolamento” é 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 SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.

O que vou aprender em “Os quatro níveis de isolamento”?

De Read Uncommitted a Serializable e o que cada nível permite. Você pratica SQL 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 SQL Interview Prep?

Nenhuma experiência prévia é necessária. SQL 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 2 de 4.

Quanto tempo leva a aula “Os quatro níveis de isolamento”?

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 SQL Interview Prep?

Sim. Cada aula de SQL 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

  1. Propriedades ACID explicadas
  2. Os quatro níveis de isolamento
  3. Leituras sujas, não repetíveis e fantasmas
  4. Deadlocks, bloqueios e MVCC
← Voltar para SQL Interview Prep