加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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;

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读