PostgreSQL: автономные транзакции

Достаточно часто на практике в рамках одной транзакции нужно иметь возможность начать другую транзакцию, результат выполнения которой не будет зависеть от успешности выполнения родительской. Такая возможность может быть очень полезна, когда нужно организовать аудит (логирование) выполнения некоторых действий вне зависимости от результата их выполнения. Транзакции ведущие себя описанным выше образом называются автономными.

В стандартной версии PostgreSQL 9.6 такой возможности нет, но она появилась в Postgres Pro Enterprise 9.6 . Это новшество приближает Postgres Pro к "крупным" СУБД таким как Oracle.

Для реализации автономных транзакций претерпели изменения операторы BEGIN/END, которые были  расширены необязательным ключевым словом AUTONOMOUS:

BEGIN [AUTONOMOUS] [TRANSACTION] [уровень-изоляции]
END [AUTONOMOUS] [TRANSACTION]

Указывать ключевое слово AUTONOMOUS в предложении END TRANSACTION не обязательно. С автономными транзакциями возможно организовать несколько уровней вложенности, но транзакция верхнего уровня автономной быть не может.

Для работы с автономными транзакциями был также расширен PL/pgSQL, ключевым словом autonomous, которое используется совместно с begin.

create or replace function mylog() returns boolean as $$
begin autonomous
        begin autonomous
        insert into log_table values ('new log',now());
        end;
        ...
        return true;
end;
$$ language plpgsql;

Более того в случае автономных транзакций можно улучшить механизм NOTIFY/LISTEN, в котором нотификация из транзакции будет отправлена только в случае ее успешного завершения. Переход на использование автономных транзакций позволяет избежать отката NOTIFY.

Важно понимать, что если в автономной транзакции возникнет исключение, то оно будет обработано, также как для вложенной транзакции.

 

28.03.2017









 
архив

подписка