Post

ACID vs BASE: Do Rigor Bancário à Flexibilidade da Escala

ACID vs BASE: Do Rigor Bancário à Flexibilidade da Escala

Quando projetamos sistemas, uma das decisões mais críticas é: o quão “certo” o dado precisa estar em um determinado momento? Para responder a isso, existem dois modelos mentais opostos de consistência: o tradicional ACID (dos bancos relacionais) e o moderno BASE (dos bancos NoSQL de alta escala).

O Conflito: Certeza vs Disponibilidade

Em um sistema bancário, se você transfere R$ 100,00, o saldo deve ser subtraído de uma conta e adicionado à outra no mesmo instante. Se algo falhar no meio, nada deve acontecer. Esse é o mundo ACID.

Já em uma rede social, se você posta uma foto, não importa se o seu amigo em Tóquio a veja 2 segundos depois de você. O importante é que o sistema nunca pare de aceitar novos posts. Esse é o mundo BASE.


1. ACID: O Rigor da Transação (Padrão SQL)

O acrônimo ACID define as propriedades que garantem que as transações do banco de dados sejam processadas de forma confiável.

  • Atomicity (Atomicidade): A operação é “tudo ou nada”. Se uma parte falha, toda a transação sofre rollback.
  • Consistency (Consistência): O banco garante que o dado saia de um estado válido para outro estado válido, respeitando todas as constraints (Unique, Foreign Keys, etc).
  • Isolation (Isolamento): Transações simultâneas não interferem umas nas outras. O resultado deve ser o mesmo que se fossem executadas sequencialmente.
  • Durability (Durabilidade): Uma vez confirmada (commit), a alteração é permanente, mesmo em caso de queda de energia ou falha do servidor.

Exemplo de Fluxo ACID (Transferência Bancária)

No diagrama abaixo, vemos como o banco bloqueia os recursos (Locks) para garantir o isolamento:

sequenceDiagram
    participant App as Aplicação
    participant DB as Banco SQL (ACID)
    
    rect rgba(0, 150, 255, 0.1)
        Note over App, DB: Início da Transação
        App->>DB: BEGIN TRANSACTION
        App->>DB: UPDATE conta SET saldo = saldo - 100 WHERE id = 1 (Lock)
        App->>DB: UPDATE conta SET saldo = saldo + 100 WHERE id = 2 (Lock)
    end

    alt Sucesso
        rect rgba(0, 255, 0, 0.1)
            App->>DB: COMMIT
            Note right of DB: Locks liberados. Dados persistidos.
        end
    else Erro (ex: falta de saldo ou queda de rede)
        rect rgba(255, 0, 0, 0.1)
            App->>DB: ROLLBACK
            Note right of DB: Estado original restaurado. Locks liberados.
        end
    end

Ideal para: Sistemas financeiros, ERPs, controle de estoque e qualquer cenário onde a inconsistência temporária signifique prejuízo direto.


2. BASE: A Fluidez da Escala (Padrão NoSQL)

O modelo BASE surgiu para lidar com sistemas que precisam escalar para milhões de usuários globais, onde o custo de manter “Locks” e sincronia absoluta (ACID) tornaria o sistema lento ou indisponível.

  • Basically Available (Basicamente Disponível): O sistema prioriza responder às requisições, mesmo que alguns nós estejam fora ou com dados antigos.
  • Soft State (Estado Suave): O estado do sistema pode mudar ao longo do tempo, mesmo sem novas entradas, devido à propagação interna de dados entre réplicas.
  • Eventual Consistency (Consistência Eventual): O sistema garante que, se não houver novas atualizações, eventualmente todos os nós terão o mesmo dado. O “atraso” pode ser de milissegundos ou alguns segundos.

Exemplo de Fluxo BASE (Contador de Likes)

No modelo BASE, a escrita é rápida em um nó e a sincronia acontece em “background”:

sequenceDiagram
    participant User as Usuário A
    participant Node1 as Nó 1 (Escrita)
    participant Node2 as Nó 2 (Leitura B)
    participant Node3 as Nó 3 (Leitura C)

    User->>Node1: Like no Post!
    Node1-->>User: OK (Sucesso Imediato)
    
    rect rgba(255, 165, 0, 0.1)
        Note over Node1, Node3: Propagação Assíncrona (Eventual)
        Node1-->>Node2: Sync Update (+1 like)
        Node1-->>Node3: Sync Update (Atrasado por rede...)
    end

    Note over Node2: Usuário B vê o like agora.
    Note over Node3: Usuário C verá o like daqui a 500ms.

Ideal para: Redes sociais, catálogos de produtos, logs de auditoria massivos e sistemas de recomendação.


Comparação Direta: ACID vs BASE

RecursoACID (SQL)BASE (NoSQL)
PrioridadeConsistência e IntegridadeDisponibilidade e Performance
EscalaVertical (Satura rápido)Horizontal (Escala quase infinito)
EstadoSíncrono e FirmeAssíncrono e Variável
IsolamentoAlto (Locks)Baixo (Otimista)
ComplexidadeSimples no Banco, Complexo na EscalaComplexo na Lógica de Negócio

Onde entra o Teorema CAP?

O modelo ACID geralmente foca em ser CP (Consistência e Tolerância a Partição), sacrificando a Disponibilidade se a rede falhar.

Já o modelo BASE foca em ser AP (Disponibilidade e Tolerância a Partição), aceitando que os dados fiquem inconsistentes por um breve período para garantir que o usuário nunca receba um erro de “Servidor Indisponível”.

(Para saber mais sobre isso, confira nosso post sobre Teorema CAP).

Takeaway Prático: ACID para Dinheiro, BASE para Engajamento

Para simplificar sua decisão arquitetural, aplique esta regra: se uma inconsistência de dados pode gerar um processo jurídico ou prejuízo financeiro direto, utilize ACID (Bancos Relacionais). Se a escala global e a experiência do usuário sem interrupções são os motores do seu crescimento, abrace a Consistência Eventual do modelo BASE (NoSQL). Lembre-se que você não precisa escolher apenas um; sistemas modernos de sucesso são poliglotas e utilizam o melhor de cada mundo para diferentes partes do domínio.

This post is licensed under CC BY 4.0 by the author.