Pular para conteúdo

Aula 18 - Transações ACID, Níveis de Isolamento e Locks 🔒

Objetivo Pedagógico

Objetivo: Conceitos avançados de transações ACID, controle de concorrência multiversão (MVCC), anomalias transacionais e níveis de isolamento ANSI SQL.


📑 1. Fundamentos Teóricos & Análise Técnica

O modelo ACID é o alicerce que garante confiabilidade absoluta em sistemas de gerenciamento de bancos de dados relacionais: - Atomicidade (Atomicity): Todas as instruções da transação são confirmadas com sucesso ou todas são revertidas (All-or-Nothing). - Consistência (Consistency): A transação conduz o banco de um estado válido a outro, respeitando restrições de integridade (Foreign Keys, Checks, Uniques). - Isolamento (Isolation): Transações concorrentes executam sem interferência mútua indevida. - Durabilidade (Durability): Uma vez feito o COMMIT, os dados são garantidamente gravados no log de escrita antecipada (WAL - Write-Ahead Logging) antes de retornarem ao cliente.

O padrão ANSI SQL define quatro Níveis de Isolamento para equilibrar concorrência e anomalias: 1. Read Uncommitted: Permite leituras sujas (Dirty Reads). 2. Read Committed: Padrão na maioria dos bancos modernos; impede leituras sujas, mas permite leituras não-repetíveis. 3. Repeatable Read: Garante que leituras repetidas vejam o mesmo snapshot, prevenindo leituras não-repetíveis. 4. Serializable: Simula a execução sequencial estrita de transações, prevenindo inclusive leituras fantasmas (Phantom Reads) e distorção de escrita (Write Skew).

📐 Arquitetura Conceitual & Diagrama de Fluxo

flowchart LR
    subgraph MVCC ["Controle de Concorrência Multiversão (MVCC)"]
        RowV1["Linha v1 (xmin: 100, xmax: 105)"] --> RowV2["Linha v2 (xmin: 105, xmax: inf)"]
    end
    Tx102["Transação 102 (Lê snapshot v1 sem travar!)"] -.-> RowV1
    Tx108["Transação 108 (Lê snapshot v2)"] -.-> RowV2
    Note["Leitores NUNCA bloqueiam Escritores!<br>Escritores NUNCA bloqueiam Leitores!"]
    style MVCC fill:#e3f2fd,stroke:#1565c0
    style RowV1 fill:#fff3e0,stroke:#e65100
    style RowV2 fill:#e8f5e9,stroke:#2e7d32

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Write-Ahead Logging (WAL): Gravação síncrona sequencial no log de transações para recuperação pós-queda (Crash Recovery). - MVCC em PostgreSQL: Cada linha possui identificadores xmin e xmax determinando a visibilidade de acordo com o snapshot da transação. - Pessimistic vs. Optimistic Locking: Uso de SELECT ... FOR UPDATE para bloqueio explícito de linhas sob alta disputa. - Detecção de Deadlocks: O motor identifica grafos cíclicos de espera entre transações e aborta uma delas automaticamente.


🛠️ 2. Implementação Prática em Transações Relacionais, Concorrência e MVCC

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// pessimistic_lock.sql (Transação com Bloqueio Pessimista SELECT FOR UPDATE)
-- Início da transação com nível de isolamento explícito
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 1. Bloqueia a linha da conta para escrita concorrente (Lock de Linha)
SELECT balance 
FROM bank_accounts 
WHERE id = 101 
FOR UPDATE;

-- 2. Executa a operação com saldo garantidamente consistente
UPDATE bank_accounts 
SET balance = balance - 250.00 
WHERE id = 101;

-- 3. Registra o lançamento contábil
INSERT INTO transaction_audit (account_id, amount, operation) 
VALUES (101, -250.00, 'SAQUE_ATM');

-- 4. Confirma todas as operações de forma atômica
COMMIT;

💡 Análise Passo a Passo do Código

  1. Cláusula FOR UPDATE: Coloca um lock exclusivo na linha da conta até o fim da transação, forçando outras transações concorrentes a aguardar.
  2. Atomicidade Garantida: Se a gravação da auditoria falhar, o ROLLBACK anula o débito da conta bancária.
  3. Consistência em Alto Volume: Impede que dois caixas eletrônicos saquem o mesmo saldo simultaneamente.

🎯 3. Próximos Passos & Sequência Didática