Noções Básicas de Transações
9 exemplos para você começar com transações PostgreSQL - 6 básicos e 3 intermediários.
Pré-requisitos
Tabelas de exemplo com chaves estrangeiras para observar o comportamento de rollback.
# Desenvolvimento local com Docker (PostgreSQL 18)
docker run -d --name pg18 -e POSTGRES_PASSWORD=dev -p 5432:5432 postgres:18
psql postgres://postgres:dev@localhost:5432/postgresExemplos Básicos
1. Transação Explícita
BEGIN inicia um bloco; COMMIT o torna durável.
BEGIN;
UPDATE app.accounts SET name = 'Acme Corp' WHERE id = 1;
COMMIT;- Todas as instruções no bloco compartilham um único snapshot
- COMMIT grava o WAL de acordo com synchronous_commit
- Clientes devem usar APIs de pool de conexões para transações
2. Rollback em Caso de Falha
ROLLBACK descarta o trabalho não confirmado.
BEGIN;
UPDATE app.accounts SET name = 'Bad' WHERE id = 1;
ROLLBACK;
SELECT name FROM app.accounts WHERE id = 1;- Use try/catch no aplicativo para ROLLBACK
- Savepoint para desfazimento parcial
- Não deixe transações falhas abertas
3. Savepoint
Ponto de rollback aninhado.
BEGIN;
INSERT INTO app.accounts (name) VALUES ('Temp');
SAVEPOINT sp1;
UPDATE app.accounts SET name = 'Oops' WHERE name = 'Temp';
ROLLBACK TO sp1;
COMMIT;- RELEASE SAVEPOINT remove o marcador
- Muitos savepoints adicionam sobrecarga
- ORMs podem não expor savepoints
4. Violação de Restrição Desfaz a Instrução
Falha de instrução única em autocommit aborta apenas essa instrução.
INSERT INTO app.accounts (id, name) VALUES (1, 'dup'); -- falha se id=1 existir- Em TX explícita, o erro aborta a TX até ROLLBACK
- Use SAVEPOINT para tentar novamente dentro da TX
- Lide com SQLSTATE no aplicativo
5. Leia Suas Escritas
A mesma sessão vê as alterações confirmadas.
BEGIN;
INSERT INTO app.accounts (name) VALUES ('NewCo') RETURNING id;
-- a mesma TX vê a linha
COMMIT;- Outras sessões veem a linha após o commit
- O nível de isolamento afeta leituras concorrentes
- RETURNING evita uma segunda viagem de ida e volta
6. Restrições Deferíveis
Verifica FK no momento do commit.
SET CONSTRAINTS ALL DEFERRED;
BEGIN;
-- reordena as inserções dentro da TX
COMMIT;- Apenas restrições DEFERRABLE participam
- Raro; prefira a ordem de inserção correta
- Documente quando usado em cargas em massa
Exemplos Intermediários
7. Padrão de Transação de Aplicativo
Formato pseudo-código para serviços.
-- Sessão SQL
BEGIN;
-- instruções de negócios
COMMIT;- Uma operação de negócio por transação, quando possível
- Evite tempo de pensamento do usuário dentro da TX
- Defina statement_timeout e lock_timeout
8. Implicação de Dois Estágios
Transações preparadas para coordenadores externos.
PREPARE TRANSACTION 'txn_abc';
-- depois: COMMIT PREPARED 'txn_abc';- Raro fora de integrações XA
- Transações preparadas bloqueiam o vacuum se abandonadas
- Monitore pg_prepared_xacts
9. Observe Transações Abertas
Estado de pg_stat_activity.
SELECT pid, xact_start, state, query
FROM pg_stat_activity
WHERE state IN ('idle in transaction','active');- 'idle in transaction' é uma causa principal de incidentes
- idle_in_transaction_session_timeout mitiga
- Mate backends apenas com o playbook de operações
Versões da Pilha: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.