4.3 自治事务概述

如果一个事务(transaction)在另一个事务中被调用,那么这个独立的事务被称作自治事务。(autonomous transaction)。用户使用自治事务可以暂时脱离其调用者的事务上下文环境,在一个新的事务中执行一系列的SQL操作(在自治事务内可以对这些操作进行提交与回滚),自治事务结束后还可以返回调用者事务的上下文环境继续执行。
     自治事务(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)被调用的自治事务内的任何操作。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10356975/viewspace-680350/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10356975/viewspace-680350/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值