在程序中将提交放在 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
它们全部是因为前两个的更改已经是COMMIT
ted。
作为一般规则,您应该不在PROCEDURE
或FUNCTION
中使用COMMIT
,但应将其留给COMMIT
事务的调用者,以便他们可以捆绑多个一起行动。
当然,在某些用例中您会想要违反此规则,但您应该分别考虑每种情况,并在您违反此规则之前花时间充分了解您的业务逻辑,这样您就知道COMMIT
ted 的含义是什么每个实例。
我应该以
AUTONOMOUS_TRANSACTION
进行此交易吗?
一个用例是记录 - 您可能有一个 PROCEDURE
调用另一个 PROCEDURE
来记录用户的操作,并且无论初始操作是成功还是失败,您都希望保留该操作的日志并确保该日志是COMMIT
ted。在这种情况下,日志记录 PROCEDURE
应该是一个 AUTONOMOUS_TRANSACTION
并包含一个 COMMIT
语句,而调用语句应该(可能)两者都没有。
因此,如果一个PROCEDURE
中的COMMIT
始终是必需的,并且与调用者COMMIT
s 的其他数据无关,那么将PROCEDURE
设为AUTONOMOUS_TRANSACTION
。如果PROCEDURE
s 可以捆绑在一起,然后将ROLLBACK
作为一个组,那么您不想让它们成为AUTONOMOUS_TRANSACTION
s。
【讨论】:
【参考方案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 之后有啥影响?的主要内容,如果未能解决你的问题,请参考以下文章