CodeGym /Cursos /SQL SELF /Mergulhando em transações

Mergulhando em transações

SQL SELF
Nível 39 , Lição 0
Disponível

A gente já falou antes no curso o que é uma transação. Só pra lembrar: é uma sequência de operações que tem que ser feita como um bloco só. Tipo quando você faz uma transferência bancária. Nesse caso, você tira grana de uma conta e coloca em outra. Se uma dessas ações falhar (por exemplo, o dinheiro saiu mas não entrou na outra conta), já viu o perrengue. É aí que as transações salvam o rolê.

Ou a transação roda inteira, ou não roda nada. Isso é o famoso princípio do "tudo ou nada".

BEGIN;
-- Diminuindo o saldo em uma conta
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Aumentando o saldo em outra conta
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT; -- Aplicando as mudanças

Se der ruim em alguma coisa, dá pra desfazer tudo usando ROLLBACK.

O que são as propriedades ACID das transações

Quando a gente fala de transações no PostgreSQL (e em bancos relacionais em geral), sempre aparece a sigla ACID — não tem nada a ver com química, relaxa. ACID significa Atomicity (atomicidade), Consistency (consistência), Isolation (isolamento), Durability (durabilidade). Essas quatro paradas garantem que os dados sejam tratados de forma segura, consistente e sem surpresas.

Atomicidade (Atomicity)
A transação acontece por completo ou não acontece nada. Se der ruim no meio, tudo volta como era antes. Imagina: você transfere dinheiro e rola um erro — ou cancela tudo, ou transfere tudo. Nada de operação pela metade.

Consistência (Consistency)
Depois que a transação termina, o banco fica num estado correto e lógico. Todas as regras, restrições e relações entre tabelas têm que ser respeitadas. Por exemplo, se não pode saldo negativo, a transação que quebrar isso nem vai ser salva.

Isolamento (Isolation)
Enquanto uma transação não terminou, outra não pode ver os dados intermediários dela. Isso evita aqueles bugs bizarros de ver dados "indefinidos". Imagina numa loja online: o dinheiro já saiu, mas o produto ainda não entrou no pedido — chato, né?

Durabilidade (Durability)
Se a transação terminou de boa, todas as mudanças ficam salvas de verdade. Mesmo se acabar a luz logo depois — os dados continuam lá no banco. É tipo apertar "Salvar" e ter certeza que tá tudo guardado.

Essas quatro propriedades são a base do motivo pelo qual transações são um mecanismo confiável pra trabalhar com banco de dados.

Exemplos de cenários usando transações

Teoria é legal, mas o poder das transações aparece mesmo é na vida real. É nessas situações — com dinheiro, tabelas relacionadas ou mudanças em massa — que as transações viram ferramenta indispensável. Elas ajudam não só a fazer as operações, mas a fazer isso com confiança, sem risco de perder dados ou deixar o banco "meio quebrado".

Aqui vão alguns exemplos clássicos de onde as transações realmente salvam o dia:

1. Processamento de pagamentos

Quando um cliente transfere dinheiro de uma conta pra outra, a transação garante que o dinheiro não vai sumir nem pra lá nem pra cá:

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;

Se não tiver saldo suficiente na primeira conta, dá pra desfazer tudo:

BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
-- Opa, saldo negativo!
ROLLBACK;

2. Atualizando tabelas relacionadas

Imagina que você atualiza o status de um estudante pra "formado" e ao mesmo tempo adiciona um registro na tabela "formados":

BEGIN;
UPDATE students SET status = 'graduated' WHERE student_id = 42;
INSERT INTO graduates (student_id, graduation_date) VALUES (42, '2023-06-10');
COMMIT;

Se uma das operações falhar (tipo deu erro no INSERT), o banco volta pro estado inicial.

3. Atualização em massa de dados

Transações são ótimas pra fazer grandes atualizações, tipo:

BEGIN;
UPDATE orders SET status = 'completed' WHERE delivery_date < CURRENT_DATE;
COMMIT;

Se o servidor cair ou você perceber que atualizou errado, dá pra desfazer tudo na hora!

Comandos pra trabalhar com transações

O PostgreSQL tem alguns comandos chave:

  • BEGIN: começa uma nova transação:

    BEGIN;
    
  • COMMIT: confirma (salva) todas as mudanças feitas na transação:

    COMMIT;
    

ROLLBACK: desfaz todas as mudanças feitas na transação atual:

ROLLBACK;

Exemplo de ciclo completo

BEGIN;
-- Algumas operações
UPDATE accounts SET balance = balance - 200 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 200 WHERE account_id = 2;

-- Decidiu desfazer as mudanças
ROLLBACK;

-- Começando de novo
BEGIN;
-- Mesmas operações, mas outro valor
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- Finalizando a transação
COMMIT;

Transações na vida real

Lojas online. Muitas plataformas usam transações pra gerenciar pedidos e pagamentos. Por exemplo, o pedido só é feito se o pagamento der certo. Se der ruim, o pedido é cancelado automaticamente.

Sistemas bancários. Transações protegem seu dinheiro de problemas tipo queda de energia do nada.

Histórico de transações. O PostgreSQL guarda logs WAL (Write-Ahead Logging) pra recuperar dados se der algum crash. Essa é a mágica que deixa as transações confiáveis.

Na próxima aula a gente vai ver os comandos BEGIN, COMMIT e ROLLBACK mais a fundo, além de exemplos de operações em massa e rollback parcial com SAVEPOINT. Até lá!

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION