Ir para o conteúdo

7.1. Transações

As transações são uma parte fundamental do PostgreSQL e permitem que você agrupe várias operações de banco de dados em uma única unidade lógica e atômica. Elas garantem a consistência e a integridade dos dados, mesmo em caso de falhas ou erros durante o processo.

Conceito de Transações

Uma transação é uma sequência lógica de operações de banco de dados que deve ser executada como uma unidade indivisível. Essas operações podem incluir inserções, atualizações e exclusões de dados. O objetivo das transações é manter a consistência dos dados, garantindo que todas as operações sejam concluídas com sucesso ou revertidas em caso de falha.

Para entender melhor o conceito de transações, considere o exemplo a seguir:

BEGIN; -- Início da transação
INSERT INTO clientes (id, nome) VALUES (1, 'João');
UPDATE contas SET saldo = saldo - 100 WHERE cliente_id = 1;
COMMIT; -- Fim da transação

Neste exemplo, as operações dentro da transação são realizadas como uma unidade indivisível. Se ocorrer algum erro durante a execução, como uma violação de restrição ou um erro de comunicação, a transação será revertida automaticamente e os dados retornarão ao estado anterior.

Propriedades ACID

As transações no PostgreSQL são projetadas seguindo as propriedades ACID, que garantem a confiabilidade e a integridade dos dados. Essas propriedades são:

  • Atomicidade (Atomicity): Uma transação é uma unidade atômica, o que significa que ela é executada completamente ou não é executada de forma alguma. Se ocorrer um erro em qualquer parte da transação, todas as operações serão revertidas (rollback), garantindo que os dados permaneçam em um estado consistente.

  • Consistência (Consistency): As transações devem levar o banco de dados de um estado consistente para outro. Isso significa que todas as restrições, como chaves estrangeiras e validações, devem ser obedecidas durante a execução da transação.

  • Isolamento (Isolation): As transações são executadas de forma isolada, como se estivessem ocorrendo individualmente, mesmo que várias transações estejam ocorrendo simultaneamente no banco de dados. Isso garante que as transações não sejam afetadas por outras transações em execução.

  • Durabilidade (Durability): Após a conclusão bem-sucedida de uma transação, todas as alterações feitas no banco de dados serão permanentes, mesmo em caso de falhas subsequentes ou reinicialização do sistema. Isso garante que os dados permaneçam consistentes mesmo em situações adversas.

Controle de Transações

No PostgreSQL, o controle de transações é feito automaticamente pelo sistema, mas você também pode controlar manualmente o início e o término de uma transação usando os comandos SQL apropriados.

BEGIN: Inicia explicitamente uma nova transação.

COMMIT: Confirma uma transação, tornando suas alterações permanentes no banco de dados.

ROLLBACK: Reverte uma transação, desfazendo todas as suas alterações e restaurando o estado anterior do banco de dados.

O comando ROLLBACK é usado para desfazer uma transação, ou seja, reverter todas as alterações feitas dentro dela e restaurar o estado anterior do banco de dados.

Quando uma transação é iniciada com o comando BEGIN, todas as operações subsequentes são agrupadas dentro dela. Se, em algum momento, ocorrer um erro ou uma condição indesejada, você pode executar o comando ROLLBACK para desfazer todas as alterações feitas até aquele ponto e retornar o banco de dados ao estado anterior à transação.

Aqui está um exemplo de como usar o ROLLBACK em SQL:

BEGIN;

UPDATE produtos SET quantidade = quantidade - 10 WHERE id = 1;

-- Verifica se o estoque é suficiente
SELECT quantidade FROM produtos WHERE id = 1 INTO estoque_atual;

IF estoque_atual < 0 THEN
    -- Caso o estoque seja insuficiente, desfaz a transação
    ROLLBACK;
ELSE
    -- Caso contrário, confirma a transação
    COMMIT;
END IF;

Neste exemplo, a transação é iniciada com BEGIN e é feita uma atualização na tabela de produtos. Em seguida, é verificado se o estoque atual é suficiente para a quantidade a ser removida. Se o estoque for insuficiente, o comando ROLLBACK é executado, desfazendo a atualização e revertendo o estado da tabela para antes da transação. Caso contrário, o comando COMMIT é executado para confirmar a transação e tornar as alterações permanentes no banco de dados.

É importante ressaltar que o uso adequado do ROLLBACK ajuda a garantir a consistência e a integridade dos dados. Ele permite desfazer operações indesejadas ou que não cumpram certas condições, evitando que o banco de dados fique em um estado inconsistente ou inválido.

Além disso, é possível usar o ROLLBACK de forma aninhada, ou seja, dentro de uma transação dentro de outra. Nesse caso, o ROLLBACK desfaz apenas a transação interna, mantendo as alterações da transação externa.