我在 PL/SQL 中有一个子程序
PRAGMA AUTONOMOUS_TRANSACTION
指示。
似乎只有在这个子程序中(有一组以相同方式使用的过程,但它们没有这个 pragma)调用这个过程的事务中的变化是不可见的!
我不明白。
其他过程会看到事务中所做的更改,但那些具有此 pragma 指令的过程除外。能够进行单独的提交是否会造成损失?
是的,自治事务就是这样——自治的并且与调用它的事务分开;在提交之前,双方都无法看到对方的更改。使用自治事务的充分理由很少:想到的主要有效用途是错误日志记录。它们经常被滥用,特别是在触发器中以避免“表正在变异”异常。在您的程序中进行自主交易的目的是什么?
具有AUTONOMOUS_TRANSACTION
编译指示的代码不仅仅是执行一些您不想在父事务失败时回滚的日志记录,这几乎总是一个错误。
自治事务是真正自治的。它们完全独立于父事务。预计自治事务内的代码无法看到任何其他事务中未提交的更改,包括在自治事务启动之前当前会话中正在进行的事务。
如果您来自 SQL Server 背景,则自治事务与嵌套事务完全不同。
自治事务子程序运行在自己独立的事务中。它们的行为方式与您打开一个额外的连接并在返回主事务之前运行程序逻辑完全相同。
由于它们是独立的,因此它们不会看到来自其父事务的未提交更改。
在 Oracle 中,当您使用 PRAGMA AUTONOMOUS_TRANSACTIONS 时,它允许存储过程作为“即发即弃”过程运行。如果您要在某些过程中进行提交,这也是必要的,因为它不允许回滚。
通常,如果您要引用包含来自触发器的提交的存储过程,则需要在开头有这一行。如果我们的存储过程包含提交,我们也遇到了需要从 Web 服务调用的存储过程。