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