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