16.4. Расширение языка PL/pgSQL для автономных транзакций
Конструкция блока в PL/pgSQL расширена необязательным ключевым словом autonomous
. Это позволяет выполнять всё тело функции как автономную транзакцию:
CREATE FUNCTION foo(x integer) RETURNS integer AS $$ BEGIN AUTONOMOUS RETURN x; END; $$ LANGUAGE plpgsql;
или создайте отдельный блок BEGIN
/END
:
CREATE OR REPLACE FUNCTION myaudit() RETURNS boolean AS $$ BEGIN AUTONOMOUS BEGIN AUTONOMOUS INSERT INTO audit_schedule VALUES ('new audit',now()); END; ... -- собственно произвести аудит RETURN true; END; $$ LANGUAGE plpgsql;
Примечание
Уровень изоляции автономных транзакций внутри блоков PL/pgSQL переопределить нельзя.
Если в блоке BEGIN AUTONOMOUS
возникает исключение, автономная транзакция прерывается, и начинается обычная процедура обработки исключения — стек поднимается до тех пор, пока это исключение не будет перехвачено каким-либо обработчиком. То есть исключения в автономных транзакциях на PL/pgSQL обрабатываются точно так же, как и с обычными подтранзакциями Postgres Pro.
Если ошибка перехватывается конструкцией EXCEPTION
, локальные переменные функции PL/pgSQL остаются в том же состоянии, в каком они были в момент ошибки, но все изменения в состоянии базы данных, произведённые данным блоком кода, откатываются назад.