3. Что это такое и для чего используется
• Вложенная транзакция внутри другой транзакции
• Свой ROLLBACK и COMMIT
• Автономная транзакция может быть закомичена, даже если внешняя
откатилась
• Удобно, например для логирования
4. Пример
CREATE OR REPLACE function some_operation(err_msg IN VARCHAR) returns void AS
BEGIN
INSERT INTO tt(id, description) VALUES (123, ‘foo bar’);
INSERT INTO tt(id, description) VALUES (123, NULL);
EXCEPTION
WHEN OTHER THEN
PRAGMA AUTONOMOUS TRANSACTION;
INSERT INTO err_log(id, timestamp, err_msg) VALUES(nextval(‘errno’), timenow(), err_msg);
COMMIT;
RAISE not_null_violation;
END;
5. В PostgreSQL
• Готовых нет, но можно кое что предпринять
• Способ с dblink или plproxy
• Cпособ с savepoint
• Сообщество в курсе проблемы
6. savepoint
При входе в эксепшн plpgsql ставит неявный savepoint
do $code$
begin
insert into t values(1);
raise notice ’1:%’, (select count(*) from t); --1:1
begin
insert into t values(1);
raise notice ’2:%’, (select count(*) from t); --2:1
raise exception sqlstate ’ZQ001’;
exception
when sqlstate ’ZQ000’ then
raise notice ’3:%’, (select count(*) from t); --3:1
end;
raise notice ’4:%’, (select count(*) from t); --4:1
end;
$code$
8. dblink или plproxy
pl/proxy это способ вызова удаленной хранимой процедуры на языке plpgsql
• все то же самое что и с savepoint, только вместо raise notice вызов удаленной
процедуры
• не быстро и есть подводные камни
9. Сообщество в курсе
• https://wiki.postgresql.org/wiki/AutonomousTransactionsUnconference2015
• 2ndQuadrant имеет наработки
• В PostgreSQL будут скорее sub-транзакции
• Уровни вложенности вряд-ли будут когда-то реализованы