oracle – BEGIN – END块在PL/SQL中的原子事务
发布时间:2020-12-12 14:28:11 所属栏目:百科 来源:网络整理
导读:这个信息应该很容易找到,但我没有运气。 当我在PL / SQL中有一个BEGIN – END块时,它是否表现为一个原子事务,它将尝试提交到END块,如果出现任何问题,回滚更改? 如果不是,我如何确保BEGIN – END块中的代码像原子事务一样运行,并且块如何“默认”运行
这个信息应该很容易找到,但我没有运气。
当我在PL / SQL中有一个BEGIN – END块时,它是否表现为一个原子事务,它将尝试提交到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; 如果出现异常,所有插入和更新都将回滚;但是一旦你想添加一个异常处理程序,它就不会回滚。所以我更喜欢使用保存点的显式方法。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |