http://blog.csdn.net/indexman/article/details/7799862

1、什么是Oracle自治事务

在官方文档中,是这样的定义的“Autonomous transactions are independent transactions that can be called from within another transaction.”就是说它被一个事务调用的事务,但它独立于它的父事务提交或回滚。

下面看一个例子

首先创建一张测试表

  MIKE@ORA11G> create table test(m varchar2(30)); 

  Table created. 

创建两个procedure,一个是自治事务的,一个是非自治事务的

 create or replace procedure auto_proce
as
pragma autonomous_transaction;
begin
insert into test values('autonomous!');
commit;
end;
/
 create or replace procedure nonauto_proce
as
begin
insert into test values('nonautonomous!');
commit;
end;
/

先调用nonauto_proce,看一下会发生什么?

 SQL> select * from test;

 未选定行

 SQL> begin
2 insert into test values('test');
3 nonauto_proce;
4 rollback;
5 end;
6 / PL/SQL 过程已成功完成。 SQL> select * from test; M
------------------------------
test
nonautonomous!
第4行的rollback并没有回滚,由于nonauto_proce过程不是自治事务,它的提交将父事务中的insert一并提交,造成rollback没有回滚,即nonauto_proce影响了它的父事务。

下面再看一下auto_proce的情况。

 SQL> truncate table test;

 表被截断。

 SQL> select * from test;

 未选定行

 SQL> begin
2 insert into test values('test1');
3 auto_proce;
4 rollback;
5 end;
6 / PL/SQL 过程已成功完成。 SQL> select * from test; M
------------------------------
autonomous!
由于auto_proce过程是自治事务,它的commit并没有影响到其父事务的rollback。从结果中,已经证明了这一点。

通过这个例子,可以看出自治事务对其父事务并不会造成任何影响。

自治事务一般会被用于:

a   匿名块

b   本地、对立或打包的函数或过程

c   对象类型的方法

d   触发器

2、自治事务与父事务(调用者)的关系

创建一个过程,在commit前休眠10秒,以便查看系统中的一些信息。

 create or replace procedure auto_p1
as
pragma AUTONOMOUS_TRANSACTION;
begin
insert into test values('test2');
dbms_lock.sleep(10);
commit;
end;

查看会话的SID(会话A)

 SQL> conn sys/admin as sysdba
已连接。
SQL> select sid from v$mystat where rownum=1; SID
----------
144

通过sqlplus打开另一个连接(会话B),查看会话信息

 SQL> select sid, username, status from v$session;

        SID USERNAME                       STATUS
---------- ------------------------------ --------
138 ACTIVE
143 SYS INACTIVE
144 SYS INACTIVE
145 SYS INACTIVE
147 SYS ACTIVE
149 ACTIVE
151 ACTIVE
157 ACTIVE
159 ACTIVE
160 ACTIVE
161 ACTIVE

在会话A执行auto_p1

 SQL> begin
2 auto_p1;
3 end;
4 / PL/SQL 过程已成功完成。

执行期间在会话B,查看会话信息

 SQL> select sid, username, status from v$session;

        SID USERNAME                       STATUS
---------- ------------------------------ --------
143 SYS INACTIVE
144 SYS INACTIVE
145 SYS INACTIVE
147 SYS ACTIVE
149 ACTIVE
151 ACTIVE
157 ACTIVE
160 ACTIVE
161 ACTIVE
162 ACTIVE
163 ACTIVE

并没有看到新的会话产生,即自治事务auto_p1与其父事务(匿名块)在同一会话中。

3、应用场景

在Tom大师的《Oracle编程艺术》中,提到了这方面的内容 – 记录错误日志或者消息。想想做过的项目中,的确
自治事务主要应用在这方面比较多,不管你的请求是否成功,只要访问到数据库,就要记录在案,使用自治事务是
一种比较不错的方案(当然还有其他方案,因为此处只说自治事务,其他方案略过)。
还有队列消息等基础数据库的消息类系统,也可以使用自治事务来记录消息的发送,实际上也是日志的记录。

下面使用一个简单的例子,说明一下。

创建两张表,一张测试表(有主键),一张是测试表的错误日志信息表。

 SQL> create table test1
( id number(8),
msg varchar2(10),
constraint test1_pk primary key(id)
); 表已创建。
 SQL> create table test1_log
2 ( dat timestamp,
3 err clob
4 ); 表已创建。

创建自治事务,用于记录操作测试表时出现的错误信息。

SQL> create or replace procedure log_err(errinfo varchar2)
2 as
3 pragma autonomous_transaction;
4 begin
5 insert into test1_log values(systimestamp, errinfo);
6 commit;
7 end;
8 / 过程已创建。

创建一个过程用于向测试进行插入操作。

SQL> create or replace procedure insert_test(numid number, msg varchar2)
2 as
3 begin
4 insert into test1 values (numid, msg);
5 end;
6 / 过程已创建。

向测试表插入数据(没有错误信息的情况)。

SQL> begin
2 insert_test(1,'testtest');
3 insert_test(2,'test');
4 exception
5 when others
6 then
7 log_err(dbms_utility.format_error_backtrace);
8 raise;
9 end;
10 / PL/SQL 过程已成功完成。
SQL> select * from test1_log;

未选定行

错误日志表中没有信息,测试表中的数据都是正确的。

下面再进行插入操作(违反测试表的主键约束,出现错误的情况)。

SQL> begin
2 insert_test(1,'ffffffff');
3 exception
4 when others
5 then
6 log_err(dbms_utility.format_error_backtrace);
7 raise;
8 end;
9 /
begin
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SYS.TEST1_PK)
ORA-06512: 在 line 7
SQL> set linesize 1000
SQL> select * from test1_log; DAT ERR
--------------------------------------------------------------------------- -------------------------------------------
30-7月 -12 07.55.26.281000 下午 ORA-06512: 在 "SYS.INSERT_TEST", line 4
ORA-06512: 在 line 2

插入操作没有成功,测试表没有新插入的数据,但是错误日志表中,记录个这次插入操作的错误信息。

上面的例子非常简单,运用到应用系统中,还需要根据系统的需求进行改造。

[转]了解oracle自治事务的更多相关文章

  1. Oracle - 自治事务autonomous transaction

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

  2. Oracle自治事务

    定        义: Autonomous transactions are independent transactions that can be called from within anot ...

  3. oracle自治事务(PRAGMA AUTONOMOUS_TRANSACTION)

    这段时间遇到一个问题,程序里明明插入了一条记录,但在后边的一段Procedure中却查不到刚刚插入的记录,最后发现这个Procedure的定义中加入了PRAGMA AUTONOMOUS_TRANSAC ...

  4. Oracle自治事务实际用例

    如下,新建两个存储过程: 在主自治事务中,我们插入一条记录,然后在自治事务中,查看表中行数,然后尝试插入三条记录,查看行数,最后rollback 查看行数,最后返回主事务,查看行数. 1.如下代码: ...

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

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

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

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

  7. oracle:触发器,自治事务 trigger

    create or replace trigger TRI_FC83_INSERT before insert ON FC83 FOR EACH ROW declare PRAGMA AUTONOMO ...

  8. Oracle与SQL自治事务

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

  9. Oracle EBS 自治事务

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

随机推荐

  1. C#实现union以及lock的使用

    1.什么是Union类型数据 联合(Union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的.每个数据成员都在相同的内存地址开始. 分配给联合的存储区数量是“要包含它最大的数据成员” ...

  2. 用 CSS 实现字符串截断

    [要求]:如何用css实现字符串截断,超出约定长度后用缩略符...代替?   ♪ 答: <html> <head> <meta charset="UTF-8&q ...

  3. C语言常用排序全解(转)

    目的:重温经典排序思想,并用C语言指针实现排序算法================================================*/ /*====================== ...

  4. [转载] C++ string, const char*, char* 之间互相转换

    1, string转const char* 类型 string str = "abcdef"; const char* con_str = string.c_str() 2, co ...

  5. shell 脚本实战笔记(1)--source/fork/exec的区别

    在linux shell编程中, 随着脚本处理规模的变大, 会嵌套调用子进程. 但父进程以不同的方式调用子进程, 其结果和背后的机制不尽相同.这边就简单描述下source/fork/exec调用子进程 ...

  6. 334. Increasing Triplet Subsequence

    Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...

  7. 关于Ajax知识点小节

    URL:统一资源定位符 网络的七层协议:网卡 驱动  网络层(ip)  传输层(tcp udp) 会话层( )  应用层(http.) restful表征状态转移(一种表征架构) CURD 增删改查 ...

  8. Codeforces Round #121 (Div. 2)

    A. Funky Numbers 记\(a \le b\),枚举\(a\)即可. B. Walking in the Rain 二分时间,然后\(dp(i)\)表示是否能从1到达i. C. Dynas ...

  9. Quailty and Binary Operation

    Quailty and Binary Operation 题意 分别给\(N,M(N,M \le 50000)\)两个数组\(A\)和\(B\),满足\(0 \le A_i,B_i \le 50000 ...

  10. 黑马程序员——JAVA基础之包,权限

    ------- android培训.java培训.期待与您交流! ---------- 包(package) 对类文件进行分类管理. 给类提供多层命名空间. 写在程序文件的第一行. 类名的全称的是:包 ...