首页 > 解决方案 > 提交和回滚语句(在子存储过程中)会影响 Postregsql 中的主存储过程吗?

问题描述

我在 Postgresql 中有 2 个存储过程:sp_main, sp_child.

sp_mainsp_child在过程中调用。问题是每当sp_childinput1 = -1 时,它都会回滚sp_main第一个插入语句。

在这种情况下如何使用savepoint语句?

问题总结:

call1() --> call2()  (call2 will have commit/rollback but will not affect call1)

代码:

CREATE OR REPLACE PROCEDURE sp_main(INOUT main_result integer)
 LANGUAGE plpgsql
AS $$
begin 
declare resultc integer
resultc=0;
---
---first insert
insert into table1
values(-1,'a'); --input1=-1
---
call sp_child(1,resultc); --call child sp. 
main_result=resultc;
---
---last insert
insert into table2
values(-7,'a');    
commit;
END ;
$$
;




CREATE OR REPLACE PROCEDURE sp_child(input1 integer DEFAULT 0,INOUT v_result integer DEFAULT 5)
 LANGUAGE plpgsql
AS $$
begin 
v_result=1;
---
---query_child
insert into table2
values(-10,'a');
---
    if input1=-1 then
            Rollback;
    end if;
END ;
$$
;



call sp_main(1);

标签: postgresql

解决方案


保存点对您没有帮助(在 PL/pgSQL 中,由BEGIN ... EXCEPTION ... END块实现)。一个保存点启动一个子事务,但是如果你ROLLBACK是,整个事务包括它的所有子事务都将被中止。

sp_main如果sp_child发出ROLLBACK. _

您将不得不重新设计您的事务处理。现在的方式无论如何都没有意义:任何INSERT执行sp_child的操作都会被回滚。


推荐阅读