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

前端之家收集整理的这篇文章主要介绍了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.f2er.com/oracle/207701.html

猜你在找的Oracle相关文章