Илья Космодемьянский, PostgreSQL-Consulting.com. «Pragma autonomous transaction»

Education

mailru-group
of 9
Description
Text
  • PRAGMA AUTONMOUS_TRANSACTIONS Илья Космодемьянский ik@postgresql-consulting.com
  • Как ни удивительно Автономные транзакции – одна из самых неприятных проблем миграции с Oracle на PostgreSQL
  • Что это такое и для чего используется • Вложенная транзакция внутри другой транзакции • Свой ROLLBACK и COMMIT • Автономная транзакция может быть закомичена, даже если внешняя откатилась • Удобно, например для логирования
  • Пример 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;
  • В PostgreSQL • Готовых нет, но можно кое что предпринять • Способ с dblink или plproxy • Cпособ с savepoint • Сообщество в курсе проблемы
  • 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$
  • savepoint - results NOTICE: 1:2 NOTICE: 2:3 NOTICE: 3:2 NOTICE: 4:2 DO
  • dblink или plproxy pl/proxy это способ вызова удаленной хранимой процедуры на языке plpgsql • все то же самое что и с savepoint, только вместо raise notice вызов удаленной процедуры • не быстро и есть подводные камни
  • Сообщество в курсе • https://wiki.postgresql.org/wiki/AutonomousTransactionsUnconference2015 • 2ndQuadrant имеет наработки • В PostgreSQL будут скорее sub-транзакции • Уровни вложенности вряд-ли будут когда-то реализованы
Comments
Top