日期:2014-05-16  浏览次数:20414 次

了解oracle自治事务

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