Pra garantir que todas as mudanças no seu banco de dados estejam sob controle e sejam feitas do jeito certo, o PostgreSQL usa o conceito de transação. Isso é um grupo de operações SQL que rolam como se fossem uma coisa só. Se der ruim em alguma parte, dá pra desfazer tudo. É aí que entram os comandos BEGIN, COMMIT e ROLLBACK.
Os comandos de transação não são só pra deixar tudo organizado — eles são essenciais pra proteger seus dados de erros e falhas. Quando você faz uma sequência de operações SQL, é importante ter certeza que tudo vai funcionar direitinho: se uma parte falhar, o banco tem que voltar pro estado original. Essa é uma das principais razões pra usar comandos de transação — eles ajudam a manter a consistência dos dados.
Além disso, as transações garantem o que a gente chama de atomicidade: ou todas as mudanças são aplicadas juntas, ou nenhuma é. Assim, não rola aquele cenário de banco "meio atualizado" — tipo, o dinheiro saiu da conta, mas o produto não entrou no pedido.
E claro, transações dão flexibilidade. Você pode montar sequências de ações mais complexas, decidir quando confirmar com COMMIT ou cancelar com ROLLBACK, e até fazer rollback só de uma parte usando SAVEPOINT. Isso deixa o trabalho com o banco não só seguro, mas também bem controlado.
Comando BEGIN
O comando BEGIN avisa o PostgreSQL que você tá começando uma transação. Depois de rodar ele, todas as mudanças que você fizer ficam "penduradas" até você terminar a transação com COMMIT ou cancelar tudo com ROLLBACK.
Um exemplo clássico: digamos que você quer transferir 100 unidades de moeda de uma conta pra outra. Você começa a transação com BEGIN:
BEGIN;
-- Começou a transação
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Diminuiu o saldo da conta 1
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- Aumentou o saldo da conta 2
Enquanto você tá rodando comandos dentro da transação, outros usuários do banco não veem suas mudanças. Elas só aparecem depois que você faz o COMMIT.
Comando COMMIT
O comando COMMIT finaliza a transação e salva todas as mudanças feitas nela no banco de dados. Depois que você roda esse comando, as alterações ficam visíveis pra todo mundo.
Exemplo de finalização de transação:
COMMIT;
-- Todas as mudanças da transação foram salvas
Agora as mudanças de saldo que a gente fez no exemplo acima ficaram "pra sempre". O dinheiro foi transferido com sucesso.
Comando ROLLBACK
Se no meio da transação você perceber um erro ou decidir cancelar as mudanças, pode usar o comando ROLLBACK. Ele desfaz todas as operações feitas depois do BEGIN.
Por exemplo, durante a transferência de grana, você percebe que não tem saldo suficiente. Aí a transação é cancelada:
BEGIN;
-- Começou a transação
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Ops, erro: saldo insuficiente.
ROLLBACK;
-- Todas as mudanças foram desfeitas, o banco voltou pro estado original
Depois do ROLLBACK, nenhuma mudança é salva no banco. Isso é muito útil pra evitar erros.
Exemplo completo: transferência de dinheiro entre contas
Bora juntar tudo. Aqui vai um exemplo completo de transação — com checagem de saldo, transferência de dinheiro e possibilidade de rollback se der erro:
BEGIN;
-- Começando a transação
-- Checando o saldo da conta
SELECT balance INTO current_balance FROM accounts WHERE account_id = 1;
-- Verificando se tem saldo suficiente
IF current_balance >= 100 THEN
-- Se tiver saldo, faz a transferência
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
-- Confirma as mudanças
ELSE
-- Se não tiver saldo, cancela a transação
ROLLBACK;
END IF;
Esse exemplo mostra como os comandos de transação trabalham juntos pra evitar inconsistência nos dados.
IF THEN ELSE END IF — são operações de procedures armazenadas, que a gente vai ver em detalhes daqui a alguns níveis :P
Particularidade do autocommit
No PostgreSQL, por padrão, o modo autocommit tá ativado, então se você roda comandos fora de uma transação explícita, eles já são salvos direto no banco. Por exemplo:
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- A mudança já é salva, mesmo sem COMMIT
Se você quiser controlar as transações na mão, é melhor sempre usar BEGIN pra começar a transação de forma explícita.
Dá pra desligar o autocommit pra sessão atual com o comando:
SET AUTOCOMMIT TO OFF;
Lembra: se o autocommit estiver desligado, você vai ter que finalizar cada sessão com COMMIT ou ROLLBACK.
Erros comuns ao trabalhar com transações
Esqueceu o COMMIT. Se você esquecer de rodar o COMMIT, suas mudanças ficam pendentes e vão ser perdidas quando a sessão acabar.
Locks. Enquanto a transação não termina, os recursos que ela usa podem ficar travados. Isso pode dar problema pra quem tenta acessar os dados ao mesmo tempo.
ROLLBACK desnecessário. Às vezes o dev é muito cauteloso e faz rollback sem precisar. Isso gera retrabalho e aumenta a carga no banco.
Transações penduradas. Se você começou uma transação mas esqueceu de terminar (nem COMMIT nem ROLLBACK), pode travar a sessão e bloquear recursos do banco.
Aplicação prática
Em entrevistas pra vaga de dev ou DBA (administrador de banco de dados), podem te perguntar como funcionam as transações no PostgreSQL. Saber usar BEGIN, COMMIT e ROLLBACK mostra que você manja de trabalhar com dados de forma segura e eficiente.
No dia a dia, transações são super úteis pra criar sistemas confiáveis, tipo processar pedidos em lojas online ou calcular pontos de fidelidade em programas de recompensa.
Agora que você já pegou o básico dos comandos de transação, dá pra ir mais fundo em temas massa, como usar SAVEPOINT e trabalhar com níveis de isolamento. PostgreSQL é um mar de possibilidades, então se prepara aí.
GO TO FULL VERSION