Aktualizacja PostgreSQL 12 :jest ograniczone wsparcie dla najwyższego poziomu PROCEDURE s, które mogą wykonywać kontrolę transakcji. Nadal nie można zarządzać transakcjami w zwykłych funkcjach wywoływanych przez SQL, więc poniższe informacje pozostają prawdziwe, z wyjątkiem sytuacji, gdy używane są nowe procedury najwyższego poziomu.
Funkcje są częścią transakcji, z której są wywoływane. Ich efekty są cofane, jeśli transakcja zostanie cofnięta. Ich praca zostaje zatwierdzona, jeśli transakcja zostanie zatwierdzona. Dowolny BEGIN ... EXCEPT bloki w funkcji działają jak (i pod maską) punkty zapisu, takie jak SAVEPOINT i ROLLBACK TO SAVEPOINT Instrukcje SQL.
Funkcja albo powiodła się w całości, albo zakończyła się niepowodzeniem w całości, z wyjątkiem BEGIN ... EXCEPT obsługa błędów. Jeśli błąd zostanie zgłoszony w funkcji i nie zostanie obsłużony, transakcja wywołująca funkcję jest przerywana. Przerwane transakcje nie mogą zatwierdzić, a jeśli próbują zatwierdzić COMMIT jest traktowany jako ROLLBACK , tak samo jak w przypadku innych błędnych transakcji. Obserwuj:
regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR: division by zero
regress=# COMMIT;
ROLLBACK
Zobacz, jak transakcja, która jest w stanie błędu z powodu dzielenia przez zero, wycofuje się po COMMIT ?
Jeśli wywołasz funkcję bez wyraźnej transakcji otaczającej, reguły są dokładnie takie same, jak w przypadku każdej innej instrukcji Pg:
BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;
(gdzie COMMIT nie powiedzie się, jeśli SELECT zgłosił błąd).
PostgreSQL nie obsługuje (jeszcze) autonomicznych transakcji w funkcjach, w których procedura/funkcja mogłaby zatwierdzić/wycofać niezależnie od transakcji wywołującej. Można to zasymulować za pomocą nowej sesji przez dblink.
ALE , rzeczy, które nie są transakcyjne lub są niedokładnie transakcyjne, istnieją w PostgreSQL. Jeśli ma zachowanie nietransakcyjne w normalnym BEGIN; do stuff; COMMIT; blok, zachowuje się również nietransakcyjnie w funkcji. Na przykład nextval i setval , TRUNCATE itp.