gpt4 book ai didi

oracle - PL/SQL 中的 BEGIN - END block 原子事务

转载 作者:行者123 更新时间:2023-12-02 10:50:35 38 4
gpt4 key购买 nike

这些信息应该很容易找到,但我没有任何运气。

当我在 PL/SQL 中有一个 BEGIN - END block 时,它是否表现为原子事务,它将尝试在命中 END block 时提交,并且如果出现问题会回滚更改吗?

如果不是,我如何确保 BEGIN - END block 内的代码的行为类似于原子事务,以及该 block “默认”的行为如何?

编辑:我正在从存储过程运行,并且我认为我正在使用隐式 block 。

最佳答案

首先,BEGIN..END仅仅是语法元素,与事务无关。

其次,在 Oracle 中,所有单独的 DML 语句都是原子的(即它们要么完全成功,要么在第一次失败时回滚任何中间更改)(除非您使用 EXCEPTIONS INTO 选项,我不会在这里讨论该选项)。

如果您希望将一组语句视为单个原子事务,您可以这样做:

BEGIN
SAVEPOINT start_tran;
INSERT INTO .... ; -- first DML
UPDATE .... ; -- second DML
BEGIN ... END; -- some other work
UPDATE .... ; -- final DML
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO start_tran;
RAISE;
END;

这样,任何异常都会导致该 block 中的语句回滚,但在此 block 之前运行的任何语句都不会回滚。

请注意,我不包含 COMMIT - 通常我更喜欢调用进程来发出提交。

<小时/>

确实,没有异常处理程序的 BEGIN..END block 会自动为您处理此问题:

BEGIN
INSERT INTO .... ; -- first DML
UPDATE .... ; -- second DML
BEGIN ... END; -- some other work
UPDATE .... ; -- final DML
END;

如果引发异常,所有插入和更新都将回滚;但一旦你想添加异常处理程序,它就不会回滚。所以我更喜欢使用保存点的显式方法。

关于oracle - PL/SQL 中的 BEGIN - END block 原子事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11966020/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com