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