PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Sind PostgreSQL-Funktionen transaktional?

PostgreSQL 12-Update :PROCEDURE der obersten Ebene wird nur eingeschränkt unterstützt s, die Transaktionskontrolle durchführen können. Sie können immer noch keine Transaktionen in regulären SQL-aufrufbaren Funktionen verwalten, daher bleibt das Folgende gültig, außer wenn Sie die neuen Prozeduren der obersten Ebene verwenden.

Funktionen sind Teil der Transaktion, von der sie aufgerufen werden. Ihre Auswirkungen werden rückgängig gemacht, wenn die Transaktion rückgängig gemacht wird. Ihre Arbeit wird festgeschrieben, wenn die Transaktion festgeschrieben wird. Jeder BEGIN ... EXCEPT Blöcke innerhalb der Funktion funktionieren wie (und verwenden unter der Haube) Sicherungspunkte wie den SAVEPOINT und ROLLBACK TO SAVEPOINT SQL-Anweisungen.

Die Funktion ist entweder vollständig erfolgreich oder schlägt vollständig fehl, mit Ausnahme von BEGIN ... EXCEPT Fehlerbehandlung. Wenn ein Fehler innerhalb der Funktion ausgelöst und nicht behandelt wird, wird die Transaktion, die die Funktion aufruft, abgebrochen. Abgebrochene Transaktionen können nicht festgeschrieben werden, und wenn sie versuchen, das COMMIT festzuschreiben wird als ROLLBACK behandelt , wie bei jeder anderen fehlerhaften Transaktion. Beachten Sie:

regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR:  division by zero
regress=# COMMIT;
ROLLBACK

Sehen Sie, wie die Transaktion, die sich aufgrund der Nullteilung im Fehlerzustand befindet, bei COMMIT zurückgesetzt wird ?

Wenn Sie eine Funktion ohne explizite umgebende Transaktion aufrufen, sind die Regeln genau dieselben wie für jede andere Pg-Anweisung:

BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;

(wobei COMMIT schlägt fehl, wenn SELECT hat einen Fehler ausgelöst).

PostgreSQL unterstützt (noch) keine autonomen Transaktionen in Funktionen, bei denen die Prozedur/Funktion unabhängig von der aufrufenden Transaktion committen/rollbacken könnte. Dies kann mit einer neuen Sitzung über dblink simuliert werden.

ABER , Dinge, die nicht transaktional oder unvollständig transaktional sind, existieren in PostgreSQL. Wenn es in einem normalen BEGIN; do stuff; COMMIT; Block hat es auch in einer Funktion nicht-transaktionales Verhalten. Beispiel:nextval und setval , TRUNCATE usw.