sql >> Database >  >> RDS >> PostgreSQL

Zijn PostgreSQL-functies transactioneel?

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.



  1. Microsoft Excel verbinden met Xero

  2. Heeft mysql het equivalent van de analytische functies van Oracle?

  3. MySQL - COUNT(*) gebruiken in de WHERE-component

  4. Verschil tussen datetime en timestamp in sqlserver?