Илья Космодемьянский, PostgreSQL-Consulting.com. «Pragma autonomous...
-
Upload
mailru-group -
Category
Education
-
view
1.156.104 -
download
0
Transcript of Илья Космодемьянский, PostgreSQL-Consulting.com. «Pragma autonomous...
Как ни удивительно
Автономные транзакции – одна из самых неприятных проблем миграции с Oracleна PostgreSQL
Что это такое и для чего используется
• Вложенная транзакция внутри другой транзакции• Свой ROLLBACK и COMMIT• Автономная транзакция может быть закомичена, даже если внешняяоткатилась
• Удобно, например для логирования
Пример
CREATE OR REPLACE function some_operation(err_msg IN VARCHAR) returns void ASBEGIN
INSERT INTO tt(id, description) VALUES (123, ‘foo bar’);INSERT INTO tt(id, description) VALUES (123, NULL);
EXCEPTIONWHEN OTHER THENPRAGMA 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$begininsert into t values(1);raise notice ’1:%’, (select count(*) from t); --1:1begininsert into t values(1);raise notice ’2:%’, (select count(*) from t); --2:1raise exception sqlstate ’ZQ001’;
exceptionwhen sqlstate ’ZQ000’ thenraise notice ’3:%’, (select count(*) from t); --3:1
end;raise notice ’4:%’, (select count(*) from t); --4:1
end;$code$
dblink или plproxy
pl/proxy это способ вызова удаленной хранимой процедуры на языке plpgsql
• все то же самое что и с savepoint, только вместо raise notice вызов удаленнойпроцедуры
• не быстро и есть подводные камни