AUTONOMOUS TRANSACTION(自治事务)的介绍
  在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事务)时,为每一步DML记录一些信息到跟踪表中,由于事务的原子性,这些跟踪信息的提交将决定于主事务的commit或rollback. 这样一来写程序的难度就增大了, 程序员不得不把这些跟踪信息记录到类似数组的结构中,然后在主事务结束后把它们存入跟踪表.哎,真是麻烦!
  有没有一个简单的方法解决类似问题呢?
  ORACLE8i的AUTONOMOUS TRANSACTION(自治事务,以下AT)是一个很好的回答。
  AT 是由主事务(以下MT)调用但是独立于它的事务。在AT被调用执行时,MT被挂起,在AT内部,一系列的DML可以被执行并且commit或rollback.
  注意由于AT的独立性,它的commit和rollback并不影响MT的执行效果。在AT执行结束后,主事务获得控制权,又可以继续执行了。

如何实现AT的定义呢?我们来看一下它的语法。其实非常简单。
  只需下列PL/SQL的声明部分加上PRAGMA AUTONOMOUS_TRANSACTION 就可以了。
  1. 顶级的匿名PL/SQL块
  2. Functions 或 Procedure(独立声明或声明在package中都可)
  3. SQL Object Type的方法
  4. 触发器。
  
  
  比如:
  在一个独立的procedure中声明AT
  CREATE OR REPLACE PROCEDURE
   Log_error(error_msg IN VARCHAR2(100))
  IS
   PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
   Insert into Error_log values ( sysdate,error_msg);
   COMMIT;
  END;
  下面我们来看一个例子,(win2000 advanced server + oracle8.1.6 , connect as scott)
  建立一个表:
  create table msg (msg varchar2(120));
  首先,用普通的事务写个匿名PL/SQL块:
  declare
   cnt number := -1; --} Global variables
   procedure local is
   begin
   select count(*) into cnt from msg;
   dbms_output.put_line('local: # of rows is '||cnt);
  
   insert into msg values ('New Record');
   commit;
   end;
  
  
   begin
   delete from msg ;
   commit;
   insert into msg values ('Row 1');
   local;
   select count(*) into cnt from msg;
   dbms_output.put_line('main: # of rows is '||cnt);
   rollback;
   local;
   insert into msg values ('Row 2');
   commit;
   local;
   select count(*) into cnt from msg;
   dbms_output.put_line('main: # of rows is '||cnt);
   end;
  运行结果(注意打开serveroutput)
  local: # of rows is 1 -> 子程序local中可以’看到’主匿名块中的uncommitted记录
  main: # of rows is 2 -> 主匿名块可以’看到’2条记录(它们都是被local commit掉的)
  local: # of rows is 2 -> 子程序local首先’看到’2条记录,然后又commit了第三条记录
  local: # of rows is 4 -> 子程序local又’看到’了新增加的记录(它们都是被local commit掉的),然后又commit了第五条记录
  main: # of rows is 5 -> 主匿名块最后’看到’了所有的记录.
  
  从这个例子中,我们看到COMMIT和ROLLBACK的位置无论是在主匿名块中或者在子程序中,都会影响到整个当前事务.
  
  
  现在用AT改写一下匿名块中的procedure local:
  ...
   procedure local is
   pragma AUTONOMOUS_TRANSACTION;
   begin
  ...
  重新运行(注意打开serveroutput)
  local: # of rows is 0 -> 子程序local中无法可以’看到’主匿名块中的uncommitted记录 (因为它是独立的)
  main: # of rows is 2 -> 主匿名块可以’看到’2条记录,但只有一条是被commited.
  local: # of rows is 1 -> 子程序local中可以’看到’它前一次commit的记录,但是主匿名块中的记录已经被提前rollback了
  local: # of rows is 3 -> 子程序local 中可以’看到’3条记录包括主匿名块commit的记录
  main: # of rows is 4 ->主匿名块最后’看到’了所有的记录.
  很明显,AT是独立的,在它执行时,MT被暂停了. AT的COMMIT,ROLLBACK并不影响MT的执行.
  运用AT时,有一些注意事项,简单列举如下:
  1. 在匿名PL/SQL块中,只有顶级的匿名PL/SQL块可以被设为AT
  2. 如果AT试图访问被MT控制的资源,可能有deadlock发生.
  3. Package 不能被声明为AT,只有package所拥有的function和procedure 才能声明为AT
  4. AT程序必须以commit 或rollback结尾,否则会产生Oracle错误ORA-06519: active autonomous transaction detected and rolled back
  在程序开发时,如果充分运用AUTONOMOUS TRANSACTION的特性,一定能取得事倍功半的效果.

原文地址:http://blog.sina.com.cn/s/blog_66cd71d90100shw7.html

(转)关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍的更多相关文章

  1. 关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍

    AUTONOMOUS TRANSACTION(自治事务)的介绍 在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事 ...

  2. Oracle与SQL自治事务

    自治事务 自治事务是独立的事务操作,如果考虑到事务回滚,必须单独写成一个触发器来完成, 一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的 ...

  3. ORACLE PRAGMA AUTONOMOUS_TRANSACTION 自治事务 单独提交某一段操作

    个人使用示例: CREATE OR REPLACE PROCEDURE logs(p_remark VARCHAR2, p_log CLOB) AS PRAGMA AUTONOMOUS_TRANSAC ...

  4. ORACLE触发器的自治事务的注意事项

    直接上代码: Create OR replace Trigger TR_ROBXMX_CLDJBHHX After INSERT OR UPDATE OR DELETE ON ROBXMX1 --要监 ...

  5. Oracle - 自治事务autonomous transaction

    自治事务 - autonomous transaction 在Oracle数据库中,有时候我们会希望记录一个过程或者函数的运行日志,不管正常运行结束还是触发异常结束,都要记录. 正常结束的没有问题,但 ...

  6. oracle 自治事物 -- autonomous transaction

    一 使用规则 : 在begin 之前申明  : PRAGMA AUTONOMOUS_TRANSACTION; 二 使用理解:autonomous transaction 是一个独立的事务,这一点是理解 ...

  7. Oracle Autonomous Transactions(自治事务)

    Oracle Autonomous Transactions Autonomous transactions allow you to leave the context of the calling ...

  8. [转]了解oracle自治事务

    http://blog.csdn.net/indexman/article/details/7799862 1.什么是Oracle自治事务 在官方文档中,是这样的定义的“Autonomous tran ...

  9. Oracle EBS 自治事务

    自治事务程序主要是自主性,那就是,独立于主要的事务.之所以独立,或者提交之后会影响其他事务处理,本质在于它本身符合编译指令的规则,也就是说它属于在编译阶段就执行的指令,而不是在运行阶段执行的. 当自治 ...

随机推荐

  1. Install Maya 2015 x64 in CentOS 7

    Thanks for Must(QQ ID)'s big help for installing Maya in CentOS7. This is my steps for installing ma ...

  2. Python 网络编程(一)

    Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  3. 无索引状态下比较DataTable的几种过滤方法效率

    先构造一个DataTable: public DataTable GetDataTable() { DataTable dtTmp = new DataTable(); dtTmp.Columns.A ...

  4. Linux命令(23)grep命令的使用

    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...

  5. openssl生成ssl证书

    openssl生成ssl证书 x509证书一般会用到三类文,key,csr,crt. Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时 ...

  6. 学习indy组件之一idhttp的使用方法

    登录 注册 百度首页 新闻 网页 贴吧 知道 音乐 图片 视频 地图 百科 文库 经验 搜索答案我要提问 首页 分类 公社 知道行家 问医生 高质量问答 经验 个人中心手机知道开放平台   关于del ...

  7. arc下dealloc得处理

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  8. 简约的ASP.NET 系统框架,提供源码。

    好东西,好东西就要分享. 其实谈不上什么好东西,但很实用,应用起来也很简单,我自己用它构建了多套ASP .NET系统,原理也很简单: 1.用XML文件编辑系统的菜单和Toolbar: 2.读取XML节 ...

  9. ios 设置声音和震动,单独控制

    一.今天项目中涉及了设置这快的声音震动和响铃,搞的头大,以前搞过,只是简单的调用系统的方法就可以实现,但是现在的公司要求,震动是震动,响铃是响铃,我看了微信,微信也是的分开的,做的很好,但是我就纳闷了 ...

  10. icePDF去水印方法

    原文:http://www.cnblogs.com/pcheng/p/5711660.html 1.首先下载到icepdf的架包. 2.用解压缩软件,对该jar文件进行解压,得到名为icepdf-co ...