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.