Вложенная функция и транзакция Postgresql

#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;$$;
  

Подробности см. В документации.

В других языках есть разные способы сделать это.