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.