如果一个事务(transaction)在另一个事务中被调用,那么这个独立的事务被称作自治事务。(autonomous transaction)。用户使用自治事务可以暂时脱离其调用者的事务上下文环境,在一个新的事务中执行一系列的SQL操作(在自治事务内可以对这些操作进行提交与回滚),自治事务结束后还可以返回调用者事务的上下文环境继续执行。
自治事务(autonomous transaction)被调用后与发起调用的事务(transaction)完全独立。她看不到调用者事务内任何未提交(uncommitted)的数据修改,也不能共享调用者事务使用的锁(lock)和其他资源。自治事务提交后,其中所做的数据修改即对其他事务有效。
自治事务(autonomous transaction)中可以再调用其他自治事务。除了资源上的限制,自治事务调用的嵌套层次没有限制。
自治事务(autonomous transaction)与其调用者之间可能会产生死锁(deadlock)。Oracle 会检测此类死锁并返回错误信息。但应用程序开发者应该避免此类死锁的发生。
自治事务(autonomous transaction)被调用后与发起调用的事务(transaction)完全独立。她看不到调用者事务内任何未提交(uncommitted)的数据修改,也不能共享调用者事务使用的锁(lock)和其他资源。自治事务提交后,其中所做的数据修改即对其他事务有效。
自治事务(autonomous transaction)中可以再调用其他自治事务。除了资源上的限制,自治事务调用的嵌套层次没有限制。
自治事务(autonomous transaction)与其调用者之间可能会产生死锁(deadlock)。Oracle 会检测此类死锁并返回错误信息。但应用程序开发者应该避免此类死锁的发生。
例如:存储过程A是一个事务,在A的过程中调用了存储过程B。
1. 这时B过程就称为一个自治事务。
2. B过程执行完成后可以继续执行A过程。
3. B过程可以提交或者回滚。其回滚和提交操作只对自身有效,对A过程无效。
4. B过程执行对A过程并不产生影响。B过程看不到A过程中任何未提交的数据修改,也无法共享A过程使用的锁和其他资源。
5. B过程commit后,其中所做的数据修改对其他事务有效。
6. B过程中可以再调用其他事务,比如调用过程C。
7. A与B,B与C之间可能会产生死锁,但A与C不会。Oracle会检测此类死锁并返回错误信息。
有些情况下,无论调用者事务是提交(commit)或回滚(roll back)都需要执行某些独立的操作,此时适合使用自治事务(autonomous transaction)。较长见的应用是事务日志(transaction logging),及重试计数(retry counter)。
4.3.1 自治的PL/SQL程序结构
用户可以通过 pragma 指令 AUTONOMOUS_TRANSACTION 将一个 PL/SQL 程序结构设定为自治事务(autonomous transaction)。pragma 是一个编译器指令(compiler directive)。用户可以将以下类型的 PL/SQL 程序结构定义为自治的:
1. 服务器端(stored)的过程(procedure)或函数(function)
2. 本地的(local)过程或函数
3. 包(package)
4. 类型方法(type method)
5. 顶级匿名块(Top-level anonymous block)
当一个自治的 PL/SQL 程序结构开始运行时,调用者的事务上下文环境(transaction context)就被挂起。这保证了自治程序结构(或由此自治程序结构调用的其他结构)内的 SQL 操作与调用者的事务上下文环境相独立,且不会对其产生影响。
当一个自治程序结构(autonomous block)调用其他程序结构或其自身时,被调用的程序结构不会与调用者共享任何事务上下文环境(transaction context)。但当一个自治程序结构调用一个非自治程序结构(non-autonomous block)时,被调用的程序结构将继承调用者的事务上下文环境。
4.3.1.1 自治程序结构中的事务控制语句
自治 PL/SQL 程序结构内的事务控制语句(transaction control statements)仅对当前的自治事务(autonomous transaction)有效。这些控制语句包括:
1. SET TRANSACTION
2. COMMIT
3. ROLLBACK
4. SAVEPOINT
5. ROLLBACK TO SAVEPOINT
同样,一个事务(transaction)内的事务控制语句(transaction control statements)也仅对其自身有效,而不会作用于被其调用的自治事务(autonomous transaction)。例如,将一个事务回滚到调用自治事务之前的某个保存点(savepoint),并不会撤消(undo)被调用的自治事务内的任何操作。
1. 这时B过程就称为一个自治事务。
2. B过程执行完成后可以继续执行A过程。
3. B过程可以提交或者回滚。其回滚和提交操作只对自身有效,对A过程无效。
4. B过程执行对A过程并不产生影响。B过程看不到A过程中任何未提交的数据修改,也无法共享A过程使用的锁和其他资源。
5. B过程commit后,其中所做的数据修改对其他事务有效。
6. B过程中可以再调用其他事务,比如调用过程C。
7. A与B,B与C之间可能会产生死锁,但A与C不会。Oracle会检测此类死锁并返回错误信息。
有些情况下,无论调用者事务是提交(commit)或回滚(roll back)都需要执行某些独立的操作,此时适合使用自治事务(autonomous transaction)。较长见的应用是事务日志(transaction logging),及重试计数(retry counter)。
4.3.1 自治的PL/SQL程序结构
用户可以通过 pragma 指令 AUTONOMOUS_TRANSACTION 将一个 PL/SQL 程序结构设定为自治事务(autonomous transaction)。pragma 是一个编译器指令(compiler directive)。用户可以将以下类型的 PL/SQL 程序结构定义为自治的:
1. 服务器端(stored)的过程(procedure)或函数(function)
2. 本地的(local)过程或函数
3. 包(package)
4. 类型方法(type method)
5. 顶级匿名块(Top-level anonymous block)
当一个自治的 PL/SQL 程序结构开始运行时,调用者的事务上下文环境(transaction context)就被挂起。这保证了自治程序结构(或由此自治程序结构调用的其他结构)内的 SQL 操作与调用者的事务上下文环境相独立,且不会对其产生影响。
当一个自治程序结构(autonomous block)调用其他程序结构或其自身时,被调用的程序结构不会与调用者共享任何事务上下文环境(transaction context)。但当一个自治程序结构调用一个非自治程序结构(non-autonomous block)时,被调用的程序结构将继承调用者的事务上下文环境。
4.3.1.1 自治程序结构中的事务控制语句
自治 PL/SQL 程序结构内的事务控制语句(transaction control statements)仅对当前的自治事务(autonomous transaction)有效。这些控制语句包括:
1. SET TRANSACTION
2. COMMIT
3. ROLLBACK
4. SAVEPOINT
5. ROLLBACK TO SAVEPOINT
同样,一个事务(transaction)内的事务控制语句(transaction control statements)也仅对其自身有效,而不会作用于被其调用的自治事务(autonomous transaction)。例如,将一个事务回滚到调用自治事务之前的某个保存点(savepoint),并不会撤消(undo)被调用的自治事务内的任何操作。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10356975/viewspace-680350/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10356975/viewspace-680350/