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 остаются в том же состоянии, в каком они были в момент ошибки, но все изменения в состоянии базы данных, произведённые данным блоком кода, откатываются назад.