12 Transações e locks - rodrigomourapinto/aprenda_postgresql GitHub Wiki

Transações e locks

Transação permite tratar várias operações como uma unidade.

Fluxo básico

BEGIN;

UPDATE produtos
SET estoque = estoque - 1
WHERE produto_id = 1
  AND estoque > 0;

INSERT INTO auditoria_produtos (produto_id, operacao)
VALUES (1, 'BAIXA_ESTOQUE');

COMMIT;

Em caso de erro ou decisão de desfazer:

ROLLBACK;

SAVEPOINT

BEGIN;

UPDATE produtos
SET preco = preco * 1.05;

SAVEPOINT ajuste_1;

UPDATE produtos
SET preco = preco * 1.10;

ROLLBACK TO SAVEPOINT ajuste_1;

COMMIT;

Locks explícitos

Para proteger linhas durante uma operação concorrente:

SELECT produto_id, estoque
FROM produtos
WHERE produto_id = 1
FOR UPDATE;

Locks não devem ser vistos apenas como detalhe técnico. Uma rotina pode ficar lenta porque outra transação está segurando um lock que ela precisa.