如何在PostgreSQL函数中使用COMMIT和ROLLBACK

时间:2018-01-16 09:05:32

标签: postgresql postgresql-10

我使用三个insert语句,如果第三个语句中有错误,我想回滚第一个和第二个语句。如果没有办法做到这一点,请告诉我一个不同的方法来处理PostgresqQL。

如果我使用COMMITROLLBACK,我会收到错误。

CREATE OR REPLACE FUNCTION TEST1 ()
   RETURNS VOID
   LANGUAGE 'plpgsql'
   AS $$
BEGIN 

    INSERT INTO table1 VALUES (1);

    INSERT INTO table1 VALUES (2);

    INSERT INTO table1 VALUES ('A');
    COMMIT;
EXCEPTION
   WHEN OTHERS THEN
   ROLLBACK;
END;$$;

以上代码无效; PostgreSQL函数不支持COMMITROLLBACK

2 个答案:

答案 0 :(得分:9)

您无法在函数中使用SAVEPOINTCOMMITROLLBACK等交易语句。

在PL / pgSQL中启动块的BEGIN与启动事务的SQL语句BEGIN不同。

只需从函数中删除COMMIT即可获得解决方案:由于整个函数始终在单个事务中运行,因此第三个语句中的任何错误都将导致ROLLBACK撤消前两个陈述。

答案 1 :(得分:0)

与其他SQL语言相比,您应该认为Postgres总是会在发生事务时隐式出错的情况下处理提交/回滚。。

doc的意思是:

事务是所有数据库系统的基本概念。事务的本质是将多个步骤捆绑成一个单一的“全有或全无”操作。这些步骤之间的中间状态对于其他并发事务是不可见的,并且如果发生某些故障导致该事务无法完成,则所有步骤都不会影响数据库。

cardinality()