Postgresql嵌套函数和事务

时间:2016-10-05 15:10:00

标签: postgresql

我对postgresql嵌套函数和事务有疑问。如您所知,postgresql中的每个函数都在一个事务中。我很好奇内部函数是否失败,外部函数中所做的所有更改都会回滚吗?

这是一个例子

function 1(){

   insert some data into table 1;
   call function2
   insert some data into table 2;


}

如果function2中有错误,那么“表1中的插入”会回滚吗?

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

是的,除非您设置了可以回滚的保存点。

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

有关详细信息,请参阅the documentation

在其他语言中,有不同的方法可以做到这一点。