微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

oracle – BEGIN – END块在PL/SQL中的原子事务

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

当我在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;

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

原文地址:https://www.jb51.cc/oracle/207701.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐