我使用三个insert语句,如果第三个语句中有错误,我想回滚第一个和第二个语句。如果没有办法做到这一点,请告诉我一个不同的方法来处理PostgresqQL。
如果我使用COMMIT
或ROLLBACK
,我会收到错误。
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函数不支持COMMIT
和ROLLBACK
。
答案 0 :(得分:9)
您无法在函数中使用SAVEPOINT
,COMMIT
或ROLLBACK
等交易语句。
在PL / pgSQL中启动块的BEGIN
与启动事务的SQL语句BEGIN
不同。
只需从函数中删除COMMIT
即可获得解决方案:由于整个函数始终在单个事务中运行,因此第三个语句中的任何错误都将导致ROLLBACK
撤消前两个陈述。
答案 1 :(得分:0)
与其他SQL语言相比,您应该认为Postgres总是会在发生事务时隐式出错的情况下处理提交/回滚。。
doc的意思是:
事务是所有数据库系统的基本概念。事务的本质是将多个步骤捆绑成一个单一的“全有或全无”操作。这些步骤之间的中间状态对于其他并发事务是不可见的,并且如果发生某些故障导致该事务无法完成,则所有步骤都不会影响数据库。
cardinality()