像这样:
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吗?在程序中放置这样的提交有什么影响?
解决方法
What is the effect of placing the commit like this in program?
Oracle Documentation将COMMIT描述为:
Purpose
Use the
COMMIT
statement to end your current transaction and make
permanent all changes performed in the transaction. A transaction is a
sequence of sql statements that Oracle Database treats as a single
unit. This statement also erases all savepoints in the transaction and
releases transaction locks.
如果你有三个PROCEDURE并且每个包含一个COMMIT语句,那么你就不能运行所有三个,如果在后一个中发生异常,则ROLLBACK它们全部,因为前两个的变化已经被COMMITted.
作为一般规则,您不应在PROCEDURE或FUNCTION中使用COMMIT,而应将其留给调用者COMMIT事务,以便他们可以将多个操作捆绑在一起.
当然,还有一些用例需要违反此规则,但您应该分别考虑每个案例,并在打破此规则之前花些时间充分了解业务逻辑,以便了解每个实例中的COMMIT.
Should I make this transaction as
AUTONOMOUS_TRANSACTION
?
一个用例是日志记录 – 您可能有一个PROCEDURE调用另一个PROCEDURE来记录用户的操作,无论初始操作是成功还是失败,您都希望保留操作日志并确保日志是COMMITted.在这种情况下,日志记录PROCEDURE应该是一个AUTONOMOUS_TRANSACTION并包含一个COMMIT语句,而调用语句应该(可能)都没有.
因此,如果一个PROCEDURE的COMMIT始终是必需的,并且与调用者是否COMMIT其他数据无关,则使PROCEDURE成为AUTONOMOUS_TRANSACTION.如果PROCEDUREs可以捆绑在一起然后ROLLBACK作为一个组,那么你不想让它们成为AUTONOMOUS_TRANSACTIONs.