这些信息应该很容易找到,但我没有任何运气。
当我有一个BEGIN - END
PL/SQL 中的块,它是否表现为原子事务,它将尝试在命中时提交END
阻止,如果出现问题会回滚更改吗?
如果不是,我如何确保 BEGIN - END 块内的代码的行为类似于原子事务,以及该块“默认”的行为如何?
编辑:我认为我正在从存储过程运行并且正在使用隐式块。
首先,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;
这样,任何异常都会导致该块中的语句回滚,但任何已运行的语句在此块之前不会被回滚。
请注意,我不包含 COMMIT - 通常我更喜欢调用进程来发出提交。
确实,没有异常处理程序的 BEGIN..END 块会自动为您处理此问题:
BEGIN
INSERT INTO .... ; -- first DML
UPDATE .... ; -- second DML
BEGIN ... END; -- some other work
UPDATE .... ; -- final DML
END;
如果引发异常,所有插入和更新都将回滚;但一旦你想添加异常处理程序,它就不会回滚。所以我更喜欢使用保存点的显式方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)