Актуализация на PostgreSQL 12 :има ограничена поддръжка за PROCEDURE
от най-високо ниво които могат да извършват контрол на транзакциите. Все още не можете да управлявате транзакции в обикновени функции, извиквани от SQL, така че следното остава вярно, освен когато използвате новите процедури от най-високо ниво.
Функциите са част от транзакцията, от която са извиквани. Техните ефекти се отменят, ако транзакцията се върне назад. Тяхната работа се ангажира, ако транзакцията се ангажира. Всяко BEGIN ... EXCEPT
блоковете във функцията работят като (и използват под капака) точки за запис като SAVEPOINT
и ROLLBACK TO SAVEPOINT
SQL изрази.
Функцията или е успешна в своята цялост, или се проваля изцяло, с изключение на BEGIN ... EXCEPT
обработка на грешки. Ако във функцията се повдигне грешка и не се обработва, транзакцията, извикваща функцията, се прекратява. Прекъснатите транзакции не могат да завършат и ако се опитат да извършат COMMIT
се третира като ROLLBACK
, както и за всяка друга транзакция с грешка. Наблюдавайте:
regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR: division by zero
regress=# COMMIT;
ROLLBACK
Вижте как транзакцията, която е в състояние на грешка поради нулево деление, се връща обратно при COMMIT
?
Ако извикате функция без изрична заобикаляща транзакция, правилата са абсолютно същите като за всеки друг израз Pg:
BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;
(където COMMIT
ще се провали, ако SELECT
повдигна грешка).
PostgreSQL (все още) не поддържа автономни транзакции във функции, където процедурата/функцията може да извърши/връща обратно независимо от извикващата транзакция. Това може да се симулира с помощта на нова сесия чрез dblink.
НО , неща, които не са транзакционни или са несъвършени транзакционни, съществуват в PostgreSQL. Ако има нетранзакционно поведение в нормален BEGIN; do stuff; COMMIT;
блок, той също има нетранзакционно поведение във функция. Например, nextval
и setval
, TRUNCATE
и др.