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

Ant*_*ton 1 oracle plsql

我在PL/SQL中有一个子程序

PRAGMA AUTONOMOUS_TRANSACTION
Run Code Online (Sandbox Code Playgroud)

指示.

这似乎是只有在这个子程序(有一组以相同的方式使用程序,但他们没有这个编译)在交易的变化调用这个程序是不可见的!

我不明白.

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

Ton*_*ews 8

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

  • 为"使用自治交易的理由很少"+1.我希望所有开发人员都考虑他们是否真的需要AT. (4认同)

Jus*_*ave 5

AUTONOMOUS_TRANSACTION如果父事务失败,那么具有pragma的代码不仅仅是做一些你不想回滚的日志记录,这几乎总是一个错误.

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

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