PostgreSQL 12-opdatering :der er begrænset understøttelse af PROCEDURE
på øverste niveau s, der kan udføre transaktionskontrol. Du kan stadig ikke administrere transaktioner i almindelige SQL-kaldbare funktioner, så nedenstående forbliver sandt, undtagen når du bruger de nye procedurer på øverste niveau.
Funktioner er en del af den transaktion, de kaldes fra. Deres virkninger rulles tilbage, hvis transaktionen ruller tilbage. Deres arbejde forpligter, hvis transaktionen forpligter. Enhver BEGIN ... EXCEPT
blokke i funktionen fungerer som (og under emhætten brug) sparepunkter som SAVEPOINT
og ROLLBACK TO SAVEPOINT
SQL-sætninger.
Funktionen lykkes enten i sin helhed eller fejler i sin helhed, med spærring af BEGIN ... EXCEPT
fejlhåndtering. Hvis en fejl opstår i funktionen og ikke håndteres, afbrydes transaktionen, der kalder funktionen. Afbrudte transaktioner kan ikke commit, og hvis de forsøger at begå COMMIT
behandles som ROLLBACK
, samme som for enhver anden fejlagtig transaktion. Bemærk:
regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR: division by zero
regress=# COMMIT;
ROLLBACK
Se hvordan transaktionen, som er i fejltilstanden på grund af nuldelingen, ruller tilbage på COMMIT
?
Hvis du kalder en funktion uden en eksplicit omgivende transaktion, er reglerne nøjagtig de samme som for enhver anden Pg-sætning:
BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;
(hvor COMMIT
mislykkes, hvis SELECT
rejste en fejl).
PostgreSQL understøtter (endnu) ikke autonome transaktioner i funktioner, hvor proceduren/funktionen kunne commite/rulle tilbage uafhængigt af den kaldende transaktion. Dette kan simuleres ved hjælp af en ny session via dblink.
MEN , ting, der ikke er transaktionelle eller er ufuldkommen transaktionelle, findes i PostgreSQL. Hvis den har ikke-transaktionel adfærd i en normal BEGIN; do stuff; COMMIT;
blok, har den også ikke-transaktionel adfærd i en funktion. For eksempel nextval
og setval
, TRUNCATE
osv.