postgresql - 提交和回滚语句(在子存储过程中)会影响 Postregsql 中的主存储过程吗?
问题描述
我在 Postgresql 中有 2 个存储过程:sp_main
, sp_child
.
sp_main
sp_child
在过程中调用。问题是每当sp_child
input1 = -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);
解决方案
保存点对您没有帮助(在 PL/pgSQL 中,由BEGIN ... EXCEPTION ... END
块实现)。一个保存点启动一个子事务,但是如果你ROLLBACK
是,整个事务包括它的所有子事务都将被中止。
sp_main
如果sp_child
发出ROLLBACK
. _
您将不得不重新设计您的事务处理。现在的方式无论如何都没有意义:任何INSERT
执行sp_child
的操作都会被回滚。
推荐阅读
- javascript - 如何在角度 8 中获取 index.html 模板上的组件值?
- powerbi - 我想在 powerBI DAX 查询中精细地赢得收入、损失收入和开放收入
- excel - 我想在左侧条件下补充多个单词
- java - 数据库连接问题 - 原因:java.sql.SQLRecoverableException: IO Error: Unknown host specified
- java - 如何在 Apache POI XSSFChart 中旋转文本标签
- mysql - Optional relation on MySQL RDB with foreign keys using AWS Appsync
- reactjs - ReactJS 正确使用有状态和无状态组件的方法?
- scala - Spark DataFrame向Ignite写数据(2.7.5)总是报错
- javascript - 使用javascript在不同端口上的不同apache服务器上运行的两个应用程序之间的通信
- python - 在 pandas 1.0.1 中使用“datetime64 [ns, UTC]”采样的 groupby 行为不正确?