这个信息应该很容易找到,但我没有运气。
当我在PL / sql中有一个BEGIN – END块时,它是否表现为一个原子事务,它将尝试提交到END块,如果出现任何问题,回滚更改?
如果不是,我如何确保BEGIN – END块中的代码像原子事务一样运行,并且块如何“默认”运行?
编辑:我从一个存储过程运行,我使用一个隐式块,我想。
首先,BEGIN..END仅仅是句法元素,与事务无关。
原文链接:https://www.f2er.com/oracle/207701.html其次,在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;
如果出现异常,所有插入和更新都将回滚;但是一旦你想添加一个异常处理程序,它就不会回滚。所以我更喜欢使用保存点的显式方法。