PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Le funzioni di PostgreSQL sono transazionali?

Aggiornamento PostgreSQL 12 :il supporto per la PROCEDURE di livello superiore è limitato s che possono fare il controllo delle transazioni. Non è ancora possibile gestire le transazioni nelle normali funzioni richiamabili da SQL, quindi quanto segue rimane vero tranne quando si utilizzano le nuove procedure di primo livello.

Le funzioni fanno parte della transazione da cui vengono chiamate. I loro effetti vengono annullati se la transazione viene annullata. Il loro lavoro si impegna se la transazione si impegna. Qualsiasi BEGIN ... EXCEPT i blocchi all'interno della funzione funzionano come (e usano sotto il cofano) punti di salvataggio come il SAVEPOINT e ROLLBACK TO SAVEPOINT Istruzioni SQL.

La funzione riesce nella sua interezza o fallisce nella sua interezza, a parte BEGIN ... EXCEPT gestione degli errori. Se viene generato un errore all'interno della funzione e non viene gestito, la transazione che chiama la funzione viene interrotta. Le transazioni interrotte non possono eseguire il commit e, se tentano di eseguire il commit, COMMIT viene trattato come ROLLBACK , come per qualsiasi altra transazione errata. Osserva:

regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR:  division by zero
regress=# COMMIT;
ROLLBACK

Guarda come la transazione, che si trova nello stato di errore a causa della divisione zero, esegue il rollback su COMMIT ?

Se chiami una funzione senza una transazione di circondamento esplicita, le regole sono esattamente le stesse di qualsiasi altra istruzione Pg:

BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;

(dove COMMIT fallirà se il SELECT ha generato un errore).

PostgreSQL non supporta (ancora) transazioni autonome nelle funzioni, in cui la procedura/funzione potrebbe eseguire il commit/rollback indipendentemente dalla transazione chiamante. Questo può essere simulato utilizzando una nuova sessione tramite dblink.

MA , in PostgreSQL esistono cose che non sono transazionali o sono imperfettamente transazionali. Se ha un comportamento non transazionale in un normale BEGIN; do stuff; COMMIT; blocco, ha anche un comportamento non transazionale in una funzione. Ad esempio, nextval e setval , TRUNCATE , ecc.