当前位置:  数据库>oracle

Oracle嵌套事务(Nested Transaction)与自治事务(Autonomous Transaction)详解

    来源: 互联网  发布时间:2017-04-16

    本文导语: 一. 概念 1. 嵌套事务(Nested Transaction): 指在一个Parent事务中嵌套的一个或多个Sub Transaction.并且主事务与其相互影响,这种事务就称为嵌套事务。以Commit作为事务的结束。 2. 自治事务(Autonomous Transaction): 指在function,procedure等su...

一. 概念 
1. 嵌套事务(Nested Transaction): 
指在一个Parent事务中嵌套的一个或多个Sub Transaction.并且主事务与其相互影响,这种事务就称为嵌套事务。以Commit作为事务的结束。 
2. 自治事务(Autonomous Transaction): 
指在function,procedure等subprograms中对事务进行自治管理,当在别的pl/sql block里去调用这些subprograms的时候这些subprograms并不随着父pl/sql block的失败而回滚,而是自己管自己commit。以Commit作为事务的结束。自治事务常用于写入LOG或TRAC信息便于查找错误。 

二. 嵌套事务的运用(Nested Transaction) 
1.预备Create Table:







  • create table TEST_POLICY   
  • (   
  •     POLICY_CODE VARCHAR2(20),   
  •     POLICY_TYPE CHAR(1)   

  • 2.创建一个嵌套事务的procedure:

  • Procedure P_Insert_Policy(I_Policy_code varchar2(20),    
  •                                 I_Policy_type char(1)) as    
  •       cnt number :=0;   
  •       begin   
  •           select count(1) into cnt from Test_Policy;   
  •           Dbms_Output.put_line('records of the test_policy is '|| cnt);   
  •              
  •           Insert into Test_Policy values(I_Policy_code, I_Policy_type);   
  •           commit;--commit in nested transaction    
  •       end P_Insert_Policy;   
  •     --call procedure used in nested transaction   
  •       PROCEDURE TEST_PL_SQL_ENTRY(   
  •                                   I_POL_ID IN VARCHAR2,   
  •                                   O_SUCC_FLG OUT VARCHAR2) AS   
  •       strSql varchar2(500);   
  •       cnt number := 0;   
  •       BEGIN   
  •          delete from test_policy;   
  •          commit;   
  •          insert into test_policy values('2010042101', '1');   
  •          select count(1) into cnt from Test_Policy;   
  •          Dbms_Output.put_line('records of the test_policy is '|| cnt);   
  •          --call nested transaction   
  •          P_Insert_Policy('2010042102', '2');   
  •          rollback;--rollback data for all transactions   
  •          commit;--master transaction commit   
  •          select count(1) into cnt from Test_Policy;   
  •          Dbms_Output.put_line('records of the test_policy is '|| cnt);   
  •          rollback;   
  •             
  •          select count(1) into cnt from Test_Policy;   
  •          Dbms_Output.put_line('records of the test_policy is '|| cnt);   
  •             
  •     END TEST_PL_SQL_ENTRY;   
  •        
  •     =>run Pl/sql:   
  •     records of the test_policy is 1 –-主事务中的操作已经commit   
  •     records of the test_policy is 1 –-主事务的操作对Nested transaction有影响。   
  •     records of the test_policy is 2 –-Nested transaction 已经Commit   
  •     records of the test_policy is 2 –-Nested transaction对主事务有影响。  

  • 将上面的nested transaction的procedure修改一下,不需要commit:

  • Procedure P_Insert_Policy(I_Policy_code T_contract_master.Policy_Code%type,    
  •                                 I_Policy_type t_contract_master.policy_type%type) as    
  •       cnt number :=0;   
  •       begin   
  •           select count(1) into cnt from Test_Policy;   
  •           Dbms_Output.put_line('records of the test_policy is '|| cnt);   
  •           Insert into Test_Policy values(I_Policy_code, I_Policy_type);   
  •           --commit;   
  •       end P_Insert_Policy;   
  •       PROCEDURE TEST_PL_SQL_ENTRY(I_POL_ID IN VARCHAR2, O_SUCC_FLG OUT VARCHAR2) AS   
  •       strSql varchar2(500);   
  •       cnt number := 0;   
  •       BEGIN   
  •          delete from test_policy;   
  •          commit;   
  •          insert into test_policy values('2010042101', '1');   
  •          select count(1) into cnt from Test_Policy;   
  •          Dbms_Output.put_line('records of the test_policy is '|| cnt);   
  •             
  •          P_Insert_Policy('2010042102', '2');   
  •          rollback;   
  •          commit;   
  •          select count(1) into cnt from Test_Policy;   
  •          Dbms_Output.put_line('records of the test_policy is '|| cnt);   
  •          rollback;   
  •             
  •          select count(1) into cnt from Test_Policy;   
  •          Dbms_Output.put_line('records of the test_policy is '|| cnt);   
  •             
  •     END TEST_PL_SQL_ENTRY;   
  •     Run Pl/Sql=>   
  •     结果是:   
  •     records of the test_policy is 1 –-主事务中的操作已经commit   
  •     records of the test_policy is 1 –-主事务的操作对Nested transaction有影响。   
  •     records of the test_policy is 0 –-Nested transaction 的数据被主事务rollback.   
  •     records of the test_policy is 0  
  •      

        
     
     
     
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3