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

Education

mailru-group
of 9
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
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