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

Oracle PL/SQL中的子程序事务行为,oracle,plsql,Oracle,Plsql,我有一个PL/SQL子程序 PRAGMA AUTONOMOUS_TRANSACTION 指令 似乎只有在这个子程序中(有一组过程以相同的方式使用,但它们没有这个pragma)调用这个过程的事务中的更改是不可见的 我不明白 其他过程可以看到事务中所做的更改,但具有此pragma指令的过程除外。能够单独提交是一种代价吗 是的,自治事务正是自治事务,它独立于调用它的事务;在提交之前,双方都无法看到对方的更改。使用自治事务的理由很少:我想到的主要有效用途是错误日志记录。它们经常被误用,特别是在触发器中

我有一个PL/SQL子程序

PRAGMA AUTONOMOUS_TRANSACTION
指令

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

我不明白


其他过程可以看到事务中所做的更改,但具有此pragma指令的过程除外。能够单独提交是一种代价吗

是的,自治事务正是自治事务,它独立于调用它的事务;在提交之前,双方都无法看到对方的更改。使用自治事务的理由很少:我想到的主要有效用途是错误日志记录。它们经常被误用,特别是在触发器中,以避免“表正在变异”异常。在您的过程中,自治事务的目的是什么?

是的,自治事务就是自治事务,它与调用它的事务是独立的;在提交之前,双方都无法看到对方的更改。使用自治事务的理由很少:我想到的主要有效用途是错误日志记录。它们经常被误用,特别是在触发器中,以避免“表正在变异”异常。在您的过程中,自治事务的目的是什么?

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

因为它们是独立的,所以它们看不到来自其父事务的未提交的更改。

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


因为它们是独立的,所以它们看不到来自其父事务的未提交的更改。

具有自治\u事务的代码几乎总是一个bug,它不仅仅是做一些记录,如果父事务失败,您不希望回滚这些记录

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


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

包含自治\u事务的代码几乎总是一个bug,它不仅仅是执行一些日志记录,如果父事务失败,您不希望回滚这些日志记录

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


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

在Oracle中,当您使用PRAGMA autonomy_事务时,它允许存储过程作为“启动并忘记”进程运行。如果要在某些过程中进行提交,这也是必要的,因为它不允许回滚


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

在Oracle中,当您使用PRAGMA autonomy_事务时,它允许存储过程作为一个“fire and forget”进程运行。如果要在某些过程中进行提交,这也是必要的,因为它不允许回滚


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

+1因为“很少有充分的理由使用自治事务”。我希望所有的开发人员都会考虑它们是否真的需要一个AT。那么,有必要在一致的状态下维护一些资源,从而在单独的事务中对它们进行更改以支持对它们的并行访问。我希望我能说得更多,但这是我被允许进入的最详细的级别:(.无论如何,谢谢,我会绞尽脑汁寻找其他一些解决方案。如果有……保持一致状态和并行访问的方法肯定是不使用自治事务?!这是一个问题还是愤怒的爆发?:)@安东-你确定你不想使用保存点而不是自治事务吗?使用自治事务与保持资源处于一致状态完全相反。+1表示“使用自治事务的理由很少”。我希望所有的开发人员都会考虑它们是否真的需要一个AT。那么,有必要在一致的状态下维护一些资源,从而在单独的事务中对它们进行更改以支持对它们的并行访问。我希望我能说得更多,但这是我被允许进入的最详细的级别:(.无论如何,谢谢,我会绞尽脑汁寻找其他一些解决方案。如果有……保持一致状态和并行访问的方法肯定是不使用自治事务?!这是一个问题还是愤怒的爆发?:)@安东-你确定你不想使用保存点而不是自治事务吗?使用自动