阜和教育
        CCNA培训
        CCNP培训
        CCIE直通车培训
        CCIP培训
        CCVP培训
        CCSP培训
        CCIE集中营培训
        windows server 2008培训
        Windows 7培训
        SQL Server 2008培训
        Windows Server 2003培训
        RHCSA培训
        RHCE培训
        RHCVA培训
        RHCDS培训
        RHCSS培训
        RHCA培训
        JBCAA培训
        JBCD培训
        OCA 认证专员培训
        Oracle 10g OCP培训
        Oracle 10g OCM培训
        H3CNA培训
        H3CNE培训
        H3CSE培训
        H3CTE培训
        H3CIE Routing&Switching培训
        BIG-IP培训
        Firepass培训
        ARX培训
        ITIL V3 Foundation培训
        ITIL V3 Capability培训
        ITIL V3 Lifecycle培训
        ITIL V3 Expert培训
        PMP培训
        Junos初级专员培训
        电信运营商科目SP培训
        Junos(SEC)培训
        E系列认证培训
        防火墙VPN认证培训
        入侵检测与防御IDP培训
        SSL认证培训
        WX认证培训
        统一接入控制UAC培训
        企业路由和交换培训
        VCP培训
        VCAP-DCA培训
        VCAP-DCD培训
        VCA-DT培训
        VCP-DT培训
        业务连续性/灾难恢复培训
        存储技师EMCST培训
        存储管理员EMCSA培训
        应用开发EMCApD培训
        系统管理员EMCSysA培训
        产品特定技术培训
    阜和教育-首页> Orale > Oracle数据库自治事务详解
跳过导航链接

Oracle数据库自治事务详解

2011-8-17 15:13:00
文章摘要:Oracle数据库的自治事务是我们本文主要要介绍的内容,接下来就让我们来一起了解一下它的神秘之处吧。 数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败。在Oracle中,一个事务是从执行第一个数据管理语言(DML)语句开始,直到执行一个COMMIT语句,提交保存这个事务,或者执行一个ROLLBACK语句,放弃此次操作...
Oracle数据库的自治事务是我们本文主要要介绍的内容,接下来就让我们来一起了解一下它的神秘之处吧。
数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败。在Oracle中,一个事务是从执行第一个数据管理语言(DML)语句开始,直到执行一个COMMIT语句,提交保存这个事务,或者执行一个ROLLBACK语句,放弃此次操作结束。
事务的“要么全部完成,要么什么都没完成”的本性会使将错误信息记入数据库表中变得很困难,因为当事务失败重新运行时,用来编写日志条目的INSERT语句还未完成。
针对这种困境,Oracle提供了一种便捷的方法,即自治事务。自治事务从当前事务开始,在其自身的语境中执行。它们能独立地被提交或重新运行,而不影响正在运行的事务。正因为这样,它们成了编写错误日志表格的理想形式。在事务中检测到错误时,您可以在错误日志表格中插入一行并提交它,然后在不丢失这次插入的情况下回滚主事务。
因为自治事务是与主事务相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,反过来情况就不同了:主事务能够检测到已经执行过的自治事务的结果。
要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL语句都是自治的。
触发无法包含COMMIT语句,除非有PRAGMA AUTONOMOUS_TRANSACTION标记。但是,只有触发中的语句才能被提交,主事务则不行。
自治事务:
1 create or replace procedure AutoNomouse_Insert is PRAGMA AUTONOMOUS_TRANSACTION;   
2 begin insert into Msg values(’AutoNomouse Insert’);   
3 commit;   
4 end; 
非自治事务:
5 CREATE OR REPLACE Procedure NonAutoNomouse_Insert as   
6 begin insert into Msg Values(’NonAutonomouse Insert’);   
7 commit;  
8 end;  
9 SQL> begin  
10 insert into Msg Values(’This Main Info’);  
11 NonAutoNomouse_Insert;  
12 rollback;  
13 end  
14 ;  
15 / PL/SQL procedure successfully completed SQL> select * from msg; MSG This Main Info  
16 NonAutonomouse Insert 
因为过程中有COMMIT;所以匿名块中得RULLBACK 是不起作用的; 由此得出:非自治事务中的COMMIT,ROLLBACK 是会影响整个事务的。
下面我们看一个另外一种情况:
17 SQL> delete msg; 2 rows deleted SQL> 这里没有COMMIT;   
18 SQL> begin  
19 insert into Msg Values(’This Main Info’);  
20 rollback; --这里加了ROLLBACK;  
21 NonAutoNomouse_Insert;  
22 rollback;  
23 end  
24 ;  
25 / PL/SQL procedure successfully completed SQL> select * from msg; MSG This Main Info  
26 NonAutonomouse Insert  
27 NonAutonomouse Insert 
竟然没有ROLLBACK (DELETE * FROM MSG ;) 为什么?因为过程就是一个新的SESSION,所以前面的SESSION 被正常EXIT,同时被自动提交;
28 SQL> commit; Commit complete   
29 SQL> select * from msg; MSG This Main Info  
30 NonAutonomouse Insert  
31 NonAutonomouse Insert SQL> commit; Commit complete SQL> select * from msg; MSG This Main Info  
32 NonAutonomouse Insert  
33 NonAutonomouse Insert  
因为这里一个新的SESSION 所以是没有意义的事务控制语句。
34 SQL> delete msg;   
35 SQL>3 rows deleted   
36 SQL> commit;  
37 SQL>Commit complete   
38 SQL> select * from msg;   
39 MSG 
下面看一下自治事务:
40 SQL> begin  
41 insert into Msg Values(’This Main Info’);  
42 AutoNomouse_Insert;  
43 rollback;  
44 end  
45 ;  
46 / PL/SQL procedure successfully completed  
47  
48 SQL> select * from msg; MSG AutoNomouse Insert 
我们看到是一行数据,显然第一条SQL INSERT 是被ROLLBACK,证明自治事务是一个独立于主程序的事务,他不会对主事务的控制产生影响。另外在分布式环境中我们经常会遇到ORA-02064 ERROR ,就是因为主事务自己有事务控制语句,然而被调用的远程过程也有自己的事物控制语句,当然就会报错,我们将被调用的过程声明为自治事务那就OK了。
关于Oracle数据库自治事务的知识就介绍到这里了,希望本次的介绍能够对您有所收获!
上一篇:CASE语句在Oracle中重新给指定字段赋值的用法
下一篇:VC程序访问Oracle数据库的存储过程时的问题解决方案
文章摘要:在用VC开发的应用程序中,访问Oracle数据库的存储过程中出现了问题如下:在脚本里面调用存储过程的时候,如果用execmysp就报告"无效字符";如果用{callmysp}则报告“游标错误”奇怪的是,用一个古老的版本的平台程序则可以用{callmysp}完成调用。 原因排查: 最初的se程序在访问数据库接口的时候只区分select开头的语句和非select开头的语句。对于非select开头的语句...