PostgreSQL 12-uppdatering :det finns begränsat stöd för PROCEDURE
på toppnivå s som kan göra transaktionskontroll. Du kan fortfarande inte hantera transaktioner i vanliga SQL-anropsbara funktioner, så nedanstående förblir sant förutom när du använder de nya procedurerna på toppnivå.
Funktioner är en del av transaktionen de anropas från. Deras effekter rullas tillbaka om transaktionen rullar tillbaka. Deras arbete förbinder sig om transaktionen binder. Alla BEGIN ... EXCEPT
block inom funktionen fungerar som (och under huven använder) räddningspunkter som SAVEPOINT
och ROLLBACK TO SAVEPOINT
SQL-satser.
Funktionen lyckas antingen i sin helhet eller misslyckas i sin helhet, med spärr BEGIN ... EXCEPT
felhantering. Om ett fel uppstår i funktionen och inte hanteras, avbryts transaktionen som anropar funktionen. Avbrutna transaktioner kan inte commit, och om de försöker begå COMMIT
behandlas som ROLLBACK
, samma som för alla andra felaktiga transaktioner. Observera:
regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR: division by zero
regress=# COMMIT;
ROLLBACK
Se hur transaktionen, som är i feltillståndet på grund av nolldelningen, rullar tillbaka på COMMIT
?
Om du anropar en funktion utan en explicit omgivande transaktion är reglerna exakt desamma som för alla andra Pg-satser:
BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;
(där COMMIT
kommer att misslyckas om SELECT
uppstod ett fel).
PostgreSQL stöder (ännu) inte autonoma transaktioner i funktioner, där proceduren/funktionen skulle kunna utföra/rulla tillbaka oberoende av den anropande transaktionen. Detta kan simuleras med en ny session via dblink.
MEN , saker som inte är transaktionella eller är ofullständigt transaktionella finns i PostgreSQL. Om det har icke-transaktionellt beteende i en normal BEGIN; do stuff; COMMIT;
block, har det icke-transaktionsbeteende i en funktion också. Till exempel, nextval
och setval
, TRUNCATE
, etc.