sql >> Databasteknik >  >> RDS >> PostgreSQL

Är PostgreSQL-funktioner transaktionella?

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.



  1. Databasalternativ/paketanvändningsrapportering

  2. ORA-12514 TNS:listener känner för närvarande inte till tjänst som efterfrågas i anslutningsbeskrivningen

  3. Hur hittar jag en lagrad procedur som innehåller <text>?

  4. 5 fördelar att njuta av när du uppgraderar din databas