我在一个包中创建了一个过程,该过程正在表中执行插入/删除操作,事务成功后,提交完成。
像这样:
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 吗?在程序中这样放置commit会有什么效果呢?
在程序中这样放置commit会有什么效果呢?
The Oracle 文档描述COMMIT
as:
Purpose
Use the COMMIT
声明结束您当前的交易并做出
永久保存事务中执行的所有更改。一笔交易是一个
Oracle 数据库将其视为单个 SQL 语句的序列
单元。该语句还会删除事务中的所有保存点,并且
释放事务锁。
如果你有三个PROCEDURE
每个都包含一个COMMIT
那么你不能运行所有三个 then,如果后一个发生异常,ROLLBACK
它们都与前两个的变化一样COMMIT
ted.
作为一般规则,您应该not use COMMIT
in a PROCEDURE
or FUNCTION
但应该留给调用者COMMIT
交易,以便他们可以将多个操作捆绑在一起。
当然,在某些用例中您可能想要违反此规则,但您应该单独考虑每种情况,并在违反此规则之前花时间充分理解您的业务逻辑,以便知道什么是COMMIT
ted在每个实例中。
我应该将这笔交易作为AUTONOMOUS_TRANSACTION
?
一个用例是日志记录 - 您可能有一个PROCEDURE
这调用了另一个PROCEDURE
记录用户的操作,并且无论初始操作是成功还是失败,您都希望保留该操作的日志并确保该日志是COMMIT
特德。在这种情况下,日志记录PROCEDURE
应该是一个AUTONOMOUS_TRANSACTION
并包含一个COMMIT
语句和调用语句应该(可能)两者都没有。
所以,如果COMMIT
of one PROCEDURE
始终是必需的,并且与调用者是否COMMIT
s 其他数据然后使PROCEDURE
an AUTONOMOUS_TRANSACTION
。如果PROCEDURE
s 可以捆绑在一起,然后ROLLBACK
作为一个团体,那么你不想让他们AUTONOMOUS_TRANSACTION
s.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)