Sobes.tech
Middle

Quais níveis de isolamento de transações em bancos de dados você conhece?

sobes.tech IA

Resposta da IA

No padrão SQL, são definidos quatro níveis de isolamento de transações: Read Uncommitted, Read Committed, Repeatable Read, Serializable.

  1. Read Uncommitted: O nível mais baixo. A transação pode ler dados que ainda não foram confirmados (ou seja, realizados por outra transação que ainda não terminou com COMMIT). Isso leva a leituras "sujas" (dirty reads).

  2. Read Committed: A transação vê apenas os dados que foram confirmados antes ou durante sua execução. Impede leituras "sujas", mas permite leituras não repetidas (non-repeatable reads) e fantasmas (phantom reads).

    • Leituras não repetidas: A mesma leitura dentro de uma transação pode retornar dados diferentes porque outra transação os modificou e confirmou entre as leituras.
    • Fantasmas: Ao executar uma consulta com condição WHERE, outra transação adiciona ou remove linhas que atendem à condição, e a mesma consulta executada novamente na mesma transação retorna um conjunto diferente de linhas.
  3. Repeatable Read: A transação vê apenas os dados que foram confirmados antes de seu início. Garante que as mesmas leituras das mesmas linhas em uma transação retornarão os mesmos dados. Impede leituras "sujas" e não repetidas. Permite fantasmas.

    // Exemplo de Repeatable Read
    // Transação 1
    // BEGIN TRANSACTION;
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Por exemplo, 100
    
    // Transação 2 (executando simultaneamente)
    // BEGIN TRANSACTION;
    // INSERT INTO users (name, status) VALUES ('Novo usuário', 'active');
    // COMMIT;
    
    // Transação 1
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Ainda 100 (fantasma)
    // COMMIT;
    
  4. Serializable: O nível mais alto de isolamento. Garante que a execução paralela de transações será equivalente a alguma execução sequencial dessas transações. Impede leituras "sujas", não repetidas e fantasmas. Pode levar à redução de desempenho devido a bloqueios.

Em diferentes SGBDs, podem existir suas próprias implementações e características dos níveis de isolamento, bem como níveis adicionais. Por exemplo, no MySQL InnoDB, o padrão é Repeatable Read.