在程序中将提交放在 DML 之后有啥影响?

Posted

技术标签:

【中文标题】在程序中将提交放在 DML 之后有啥影响?【英文标题】:What is the effect of placing the commit after DML in procedure?在程序中将提交放在 DML 之后有什么影响? 【发布时间】:2017-06-19 06:38:55 【问题描述】:

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

像这样:

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 进行吗?将这样的提交放在程序中会有什么影响?

【问题讨论】:

【参考方案1】:

把这样的commit放到程序里有什么效果?

Oracle Documentation 将COMMIT 描述为:

目的

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

如果您有三个 PROCEDURE 并且每个都包含一个 COMMIT 语句,那么您不能同时运行这三个语句,如果后一个发生异常,则 ROLLBACK 它们全部是因为前两个的更改已经是COMMITted。

作为一般规则,您应该PROCEDUREFUNCTION 中使用COMMIT,但应将其留给COMMIT 事务的调用者,以便他们可以捆绑多个一起行动。

当然,在某些用例中您会想要违反此规则,但您应该分别考虑每种情况,并在您违反此规则之前花时间充分了解您的业务逻辑,这样您就知道COMMITted 的含义是什么每个实例。

我应该以AUTONOMOUS_TRANSACTION 进行此交易吗?

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

因此,如果一个PROCEDURE 中的COMMIT 始终是必需的,并且与调用者COMMITs 的其他数据无关,那么将PROCEDURE 设为AUTONOMOUS_TRANSACTION。如果PROCEDUREs 可以捆绑在一起,然后将ROLLBACK 作为一个组,那么您不想让它们成为AUTONOMOUS_TRANSACTIONs。

【讨论】:

【参考方案2】:

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

例如:第一个场景

    更新表1 pragma自主事务->更新表2->提交 回滚

表 2 将被提交,表 1 将被回滚

例如:第二种情况

    更新表 1 更新表 2 -> 提交 回滚

表 1 和 2 都将被提交,因为它将其视为一个事务

【讨论】:

【参考方案3】:

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

AUTONOMOUS_TRANSACTION

pragma 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;

/

【讨论】:

这是一个仅链接的答案。最好在答案中包含链接文章中的相关点。 另外,自治事务很容易被误用。你不应该建议人们使用它们,除非你知道他们有合适的场景。这里不是这样。

以上是关于在程序中将提交放在 DML 之后有啥影响?的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 8 中重置 iOS 分发证书有啥影响?

oracle 大数据量 删除插入 有啥影响

在Linux系统中禁用22端口之后会有啥影响?

在Linux系统中禁用22端口之后会有啥影响?

在Linux系统中禁用22端口之后会有啥影响?

使用二进制排序规则有啥影响?