#postgresql
#postgresql
Вопрос:
У меня есть вопрос о вложенной функции и транзакции postgresql. Как вы знаете, каждая функция в postgresql находится в транзакции. Мне интересно, если внутренняя функция завершилась с ошибкой, будут ли все изменения, внесенные во внешнюю функцию, отменены?
вот один пример
function 1(){
insert some data into table 1;
call function2
insert some data into table 2;
}
Будут ли «вставки в таблице 1» откатываться, если в функции2 есть какая-то ошибка?
Любой совет?
Ответ №1:
Да, если вы не установите точку сохранения, до которой вы можете выполнить откат.
В PL / pgSQL это неявно выполняется с BEGIN ... EXCEPTION ... END;
помощью блока, поэтому следующий не будет откатывать первый INSERT
:
CREATE FUNCTION function 1() RETURNS void
LANGUAGE plpgsql AS
$$BEGIN
insert some data into table 1;
BEGIN
function2();
EXCEPTION
WHEN others THEN /* catch any exception */
NULL; / ignore error */
END;
insert some data into table 2;
END;$$;
Подробности см. В документации.
В других языках есть разные способы сделать это.