oracle 存储过程 savepoint,Oracle存储过程中的commit 和 savepoint

这篇博客探讨了Oracle和PostgreSQL在处理事务和保存点上的不同。在Oracle中,BEGIN/END仅用于逻辑分组,COMMIT会提交所有未提交的更改,即使在不同层级的BEGIN/END块中,且COMMIT后SAVEPOINT无效。而在PostgreSQL中,函数不支持COMMIT/ROLLBACK,但可以通过EXCEPTION块实现类似保存点的功能,当发生错误时回滚到保存点,不影响外部事务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE OR REPLACE PROCEDURE skeleton

IS

BEGIN

begin

insert into a values(10);

begin

insert into a values(11);

end;

end;

begin

--savepoint ps;

insert into a values(20);

commit;

end;

begin

insert into a values(30);

end;

insert into a values(40);

--commit;

rollback;

--rollback to ps;

END;

在oracle 中,begin end 只起标记作用,commit会把前面没提交的全部提交,不管begin ,end所在的层次,而且提交后,后面的rollback 也无法回滚,

savepoint  和 rollback 可以在不同的begin end 中,而且一但commit之后,savepoint将失效。

exec skeleton();

在postgresql 9.0中

CREATE OR REPLACE function skeleton() RETURNS VOID AS

$$

BEGIN

insert into a values(0);

begin

--savepoint ps;

insert into a values(1);

--commit;

end;

begin

insert into a values(2);

end;

insert into a values(3);

--commit;

--rollback to ps;

--ROLLBACK;

END;

EXCEPTION WHEN unique_violation THEN

$$LANGUAGE plpgsql;

不支持存储过程,只支持function,

在function之中,不支持rollback ,commit, savepoint

Question 1:  does pg/psql functions allow "SAVEPOINT/ROLLBACK" functionality? (if so how?)

Yes.  However, you cannot use that syntax directly.  You rather use it by establishing EXCEPTION clauses in BEGIN/END blocks.  Upon entering any BEGIN/END block which has an EXCEPTION clause, an implicit SAVEPOINT

is executed.  If any exception (read: error) is found while executing the block, the savepoint will be automatically rolled back and control passed to the EXCEPTION block.

It is important not to confuse the use of BEGIN/END for grouping statements in PL/pgSQL with the database commands for transaction control. PL/pgSQL's BEGIN/END are only for grouping; they do not start or end a transaction. Functions and trigger procedures are always executed within a transaction established by an outer query — they cannot start or commit that transaction, since there would be no context for them to execute in. However, a block containing an EXCEPTION clause effectively forms a subtransaction that can be rolled back without affecting the outer transaction.

mysql

DELIMITER $$

DROP PROCEDURE IF EXISTS `a`.`skeleton` $$

CREATE PROCEDURE `a`.`skeleton` ()

BEGIN

begin

insert into a values(10);

begin

insert into a values(11);

end;

-- rollback;

end;

begin

insert into a values(20);

-- commit;

end;

START TRANSACTION;

-- savepoint ps1;

begin

insert into a values(30);

end;

-- rollback to savepoint ps1;

insert into a values(40);

-- commit;

rollback;

END $$

DELIMITER ;0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值