PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

As funções do PostgreSQL são transacionais?


Atualização do PostgreSQL 12 :há suporte limitado para PROCEDURE de nível superior s que podem fazer o controle de transações. Você ainda não pode gerenciar transações em funções regulares que podem ser chamadas por SQL, portanto, o abaixo permanece verdadeiro, exceto ao usar os novos procedimentos de nível superior.

As funções fazem parte da transação da qual são chamadas. Seus efeitos são revertidos se a transação for revertida. O trabalho deles é confirmado se a transação for confirmada. Qualquer BEGIN ... EXCEPT blocos dentro da função operam como (e sob o capô usam) pontos de salvamento como o SAVEPOINT e ROLLBACK TO SAVEPOINT instruções SQL.

A função é bem-sucedida em sua totalidade ou falha em sua totalidade, exceto BEGIN ... EXCEPT Manipulação de erros. Se um erro for gerado dentro da função e não for tratado, a transação que chama a função será abortada. As transações abortadas não podem ser confirmadas e, se tentarem, COMMIT é tratado como ROLLBACK , o mesmo que para qualquer outra transação com erro. Observar:
regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR:  division by zero
regress=# COMMIT;
ROLLBACK

Veja como a transação, que está no estado de erro devido à divisão zero, é revertida em COMMIT ?

Se você chamar uma função sem uma transação envolvente explícita, as regras são exatamente as mesmas de qualquer outra instrução Pg:
BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;

(onde COMMIT falhará se o SELECT gerou um erro).

O PostgreSQL (ainda) não suporta transações autônomas em funções, onde o procedimento/função pode confirmar/reverter independentemente da transação de chamada. Isso pode ser simulado usando uma nova sessão via dblink.

MAS , coisas que não são transacionais ou são imperfeitamente transacionais existem no PostgreSQL. Se tiver comportamento não transacional em um BEGIN; do stuff; COMMIT; bloco, ele também tem comportamento não transacional em uma função. Por exemplo, nextval e setval , TRUNCATE , etc