我在一个包中创建了一个过程,该过程在表中进行插入/删除,成功完成后,提交完成。
像这样: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吗?在程序中放置这样的提交有什么影响?
答案 0 :(得分:5)
将这样的提交放在程序中会有什么影响?
Oracle Documentation将COMMIT
描述为:
<强>目的强>
使用
COMMIT
语句结束当前的交易并进行制作 永久所有在交易中执行的更改。交易是一个 Oracle数据库视为单个语句的SQL语句序列 单元。此语句还会擦除事务中的所有保存点 释放事务锁。
如果你有三个PROCEDURE
且每个都包含一个COMMIT
语句,那么你就不能再运行所有这三个语句,如果在后一个语句中发生异常,ROLLBACK
它们全部作为更改从前两个已经COMMIT
ted。
作为一般规则,您应该不在COMMIT
或PROCEDURE
中使用FUNCTION
,但应将其留给调用者{{1}这个事务可以将多个动作捆绑在一起。
当然,有一些用例需要违反此规则,但您应该分别考虑每个案例,并在违反此规则之前花些时间充分了解您的业务逻辑,以便了解COMMIT
每个例子都有。
我应该将此交易设为
COMMIT
吗?
一个用例是日志记录 - 您可能有AUTONOMOUS_TRANSACTION
调用另一个PROCEDURE
来记录用户的操作,无论初始操作是成功还是失败,您都希望记录操作日志并确保日志为PROCEDURE
。在这种情况下,日志记录COMMIT
应该是PROCEDURE
并包含AUTONOMOUS_TRANSACTION
语句,并且调用语句应该(可能)都没有。
因此,如果一个COMMIT
的{{1}}始终是必需的,并且与调用者COMMIT
的其他数据无关,那么PROCEDURE
为COMMIT
}。如果PROCEDURE
可以捆绑在一起,然后AUTONOMOUS_TRANSACTION
作为一个群组,那么您不希望将PROCEDURE
设为ROLLBACK
。
答案 1 :(得分:1)
取决于你想做什么。如果您希望该过程成为独立交易,那么我建议您添加pragma autonomous_transaction
。
例如:第一种情况
表2将被提交,表1将被回滚
Ex:第二种情况
表1和表2都将被提交,因为它将其视为一个事务
答案 2 :(得分:-1)
我建议你参考这篇文章。它将澄清您的疑问。
编译指示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;
/