在功能/过程中进行DML操作后是否需要提交?


20

我想知道是否有必要在函数/过程中的插入/删除/更新之后写提交?

例:

create or replace function test_fun
return number is
begin
   delete from a;
   return 0;
end;

或程序

create or replace procedure aud_clear_pro
as
begin
   delete from a;
end;

删除后需要提交吗?

无法了解以下情况:

  1. 如果我从SQL窗口调用函数/过程,则需要提交

  2. 如果我使用dbms_scheduler计划功能/过程并运行作业,则自动提交delete语句。

    为什么?

Answers:


24

通常,不应提交程序。这些类型的事务控制决策应留给高层代码,这些代码知道逻辑事务何时实际完成。如果在存储过程中进行提交,则将限制其可重用性,因为要使该过程进行的更改成为较大事务的一部分的调用者无法直接调用该过程。

如果以交互方式调用过程,则必须显式提交或回滚事务,因为Oracle不知道您是否打算将该过程调用作为逻辑事务,还是打算组成涉及多个过程调用的较大事务。如果使用dbms_scheduler,则dbms_scheduler假定作业是一个逻辑事务,并假设作业成功(dbms_job在执行相同操作时)在作业结束时提交。

函数不应首先处理数据。不能从SQL语句调用操作数据的函数(除非在极端情况下,该函数本身被声明为使用自主事务,这几乎是不合适的)。同时具有功能和过程的全部要点是,功能可以嵌入SQL语句中,并且可以更自由地授予用户,因为它们不会更改任何数据。


1
在Oracle中,调用者是否无法开始绑定过程调用的事务?在SQL Server中,您可以在过程内进行提交,但是如果调用方在调用该过程之前打开了事务,则在调用方也提交之前,不会提交任何事务。
Nick Chammas

4
@NickChammas-Oracle没有嵌套事务的概念,不是。如果该过程得以落实,那么调用者到那时为止所做的一切都将得到落实。调用方始终使用其第一条语句(无论是过程调用还是其他方式)隐式启动事务,因此应始终由调用方来结束事务。
贾斯汀·凯夫2012年

@JustinCave的确如此,请不要忘记自动交易。
菲尔(Philᵀᴹ)2012年

@Phil-是的,但这是一种完全不同的动物。自主事务无法看到调用者所做的未提交的更改,也不能被调用者回滚,因此,除了日志记录过程之外,其他任何东西都必须声明为使用自主事务的可能性很小。
贾斯汀·凯夫

4

回答你的问题;为什么?

您可能已经知道了这一点,因为该职位已有2年历史了。但我只记录一下。

#1要求提交而#2不需要的原因是因为Oracle中的默认数据库设置是在会话结束时提交事务。如果您使用sqlplus并手动运行代码,它将不会立即提交事务。如果发出显式提交或注销sqlpus,则事务将提交。

之所以在#2上获得自动提交,是因为它创建了一个运行脚本的会话。完成后,它将自动注销,这将导致自动提交。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.