在程序中将DML置于提交后会产生什么影响?

时间:2017-02-02 09:03:49

标签: oracle oracle11g

我在一个包中创建了一个过程,该过程在表中进行插入/删除,成功完成后,提交完成。

像这样:

create or replace package pac is    
procedure pr_test(emp_id number)
is
begin
-- some code
if something then
  insert
else
  delete

commit;
end pr_test;
end pac ;

我应该将此交易作为AUTONOMOUS_TRANSACTION吗?在程序中放置这样的提交有什么影响?

3 个答案:

答案 0 :(得分:5)

  

将这样的提交放在程序中会有什么影响?

Oracle DocumentationCOMMIT描述为:

  

<强>目的

     

使用COMMIT语句结束当前的交易并进行制作   永久所有在交易中执行的更改。交易是一个   Oracle数据库视为单个语句的SQL语句序列   单元。此语句还会擦除事务中的所有保存点   释放事务锁。

如果你有三个PROCEDURE且每个都包含一个COMMIT语句,那么你就不能再运行所有这三个语句,如果在后一个语句中发生异常,ROLLBACK它们全部作为更改从前两个已经COMMIT ted。

作为一般规则,您应该COMMITPROCEDURE中使用FUNCTION,但应将其留给调用者{{1}这个事务可以将多个动作捆绑在一起。

当然,有一些用例需要违反此规则,但您应该分别考虑每个案例,并在违反此规则之前花些时间充分了解您的业务逻辑,以便了解COMMIT每个例子都有。

  

我应该将此交易设为COMMIT吗?

一个用例是日志记录 - 您可能有AUTONOMOUS_TRANSACTION调用另一个PROCEDURE来记录用户的操作,无论初始操作是成功还是失败,您都希望记录操作日志并确保日志为PROCEDURE。在这种情况下,日志记录COMMIT应该是PROCEDURE并包含AUTONOMOUS_TRANSACTION语句,并且调用语句应该(可能)都没有。

因此,如果一个COMMIT的{​​{1}}始终是必需的,并且与调用者COMMIT的其他数据无关,那么PROCEDURECOMMIT }。如果PROCEDURE可以捆绑在一起,然后AUTONOMOUS_TRANSACTION作为一个群组,那么您不希望将PROCEDURE设为ROLLBACK

答案 1 :(得分:1)

取决于你想做什么。如果您希望该过程成为独立交易,那么我建议您添加pragma autonomous_transaction

例如:第一种情况

  1. 更新表1
  2. pragma autonomous_transaction - &gt; update table 2 - &gt;提交
  3. 回滚
  4. 表2将被提交,表1将被回滚

    Ex:第二种情况

    1. 更新表1
    2. 更新表2 - &gt;提交
    3. 回滚
    4. 表1和表2都将被提交,因为它将其视为一个事务

答案 2 :(得分:-1)

我建议你参考这篇文章。它将澄清您的疑问。

AUTONOMOUS_TRANSACTION

编译指示AUTONOMOUS_TRANSACTION指示编译器将pragma后面的pl / sql块视为与调用事务的自主(独立)。

您是否应该使自主交易完全取决于使用标准。在两种方式中都必须放入COMMIT。

下面的例子将清楚说明。

CREATE OR REPLACE
PROCEDURE testav
AS
  PRAGMA AUTONOMOUS_TRANSACTION; --Declaring is Autonomous Transaction.
BEGIN
  INSERT INTO testa VALUES
    ('1','2',sysdate
    );
    commit;
END;

DECLARE
  lv_num NUMBER;
BEGIN
  testav; -- Calling the Procedure
  lv_num:=to_number('av'); --This will fail to parse but the procedure call will be successfull even though the calling block has failed.
END;

/