PostgreSQL 12-update :er is beperkte ondersteuning voor PROCEDURE
op het hoogste niveau s die transactiecontrole kunnen doen. U kunt nog steeds geen transacties beheren in reguliere SQL-aanroepbare functies, dus het onderstaande blijft waar, behalve wanneer u de nieuwe procedures op het hoogste niveau gebruikt.
Functies maken deel uit van de transactie waaruit ze worden aangeroepen. Hun effecten worden teruggedraaid als de transactie wordt teruggedraaid. Hun werk begaat als de transactie begaat. Elke BEGIN ... EXCEPT
blokken binnen de functie werken als (en onder de motorkap gebruiken) savepoints zoals het SAVEPOINT
en ROLLBACK TO SAVEPOINT
SQL-instructies.
De functie slaagt in zijn geheel of faalt in zijn geheel, behalve BEGIN ... EXCEPT
foutafhandeling. Als er een fout wordt gegenereerd binnen de functie en niet wordt afgehandeld, wordt de transactie die de functie aanroept afgebroken. Afgebroken transacties kunnen niet worden vastgelegd, en als ze proberen om de COMMIT
wordt behandeld als ROLLBACK
, hetzelfde als voor elke andere foutieve transactie. Let op:
regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR: division by zero
regress=# COMMIT;
ROLLBACK
Zie hoe de transactie, die zich in de foutstatus bevindt vanwege de nuldeling, terugdraait op COMMIT
?
Als je een functie aanroept zonder een expliciete omringende transactie, zijn de regels precies hetzelfde als voor elk ander Pg-statement:
BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;
(waar COMMIT
zal mislukken als de SELECT
heeft een fout gemaakt).
PostgreSQL ondersteunt (nog) geen autonome transacties in functies, waarbij de procedure/functie onafhankelijk van de aanroepende transactie zou kunnen committen/terugdraaien. Dit kan worden gesimuleerd met behulp van een nieuwe sessie via dblink.
MAAR , dingen die niet transactioneel of onvolmaakt transactioneel zijn, bestaan in PostgreSQL. Als het niet-transactioneel gedrag vertoont in een normale BEGIN; do stuff; COMMIT;
blok, het heeft ook niet-transactioneel gedrag in een functie. Bijvoorbeeld nextval
en setval
, TRUNCATE
, enz.