PL / SQL中的子程序事务行为

时间:2012-07-12 15:41:03

标签: oracle plsql

我在PL / SQL中有一个

的子程序
PRAGMA AUTONOMOUS_TRANSACTION

指令。

似乎只有在这个子程序中(有一组程序以相同的方式使用,但它们没有这个编译指示)调用此过程的事务中的更改不可见!

我不明白。

其他过程会查看在事务中所做的更改,但具有此pragma指令的人除外。能够单独提交是否会造成损失?

4 个答案:

答案 0 :(得分:8)

是的,一个自治事务就是这样 - 自治并且与调用它的事务分开;在提交之前,他们都无法看到其他的变化。使用自治事务的原因很少:想到的主要有效用途是错误记录。他们经常被误用,特别是在触发器中,以避免表格变异"例外。您程序中自主交易的目的是什么?

答案 1 :(得分:5)

具有AUTONOMOUS_TRANSACTION编译指示的代码,如果父事务失败,则不会简单地执行一些您不希望回滚的日志记录,这几乎总是一个错误。

自主交易是真正自主的。它们完全独立于父事务。预计自治事务中的代码无法在任何其他事务中看到未提交的更改,包括在自治事务启动之前当前会话中正在进行的事务。

如果您来自SQL Server后台,则自动事务与嵌套事务完全不同。

答案 2 :(得分:4)

Autonomous transaction子程序在自己的独立事务中运行。它们的行为方式与您在返回主事务之前打开额外连接并运行程序逻辑的方式完全相同。

由于它们是独立的,因此它们不会从父事务中看到未提交的更改。

答案 3 :(得分:0)

在Oracle中,当您使用PRAGMA AUTONOMOUS_TRANSACTIONS时,它允许存储过程作为“即发即弃”进程运行。如果您要在某些过程中进行提交,这也是必要的,因为它不允许回滚。

通常,如果要引用包含来自触发器的提交的存储过程,则需要在开头使用此行。如果它们包含提交,我们也会在从Web服务调用的存储过程中遇到这种情况。