了解oracle自治事务(一)

2014-11-24 12:20:27 · 作者: · 浏览: 2

了解oracle自治事务
1、什么是Oracle自治事务
在官方文档中,是这样的定义的“Autonomous transactions are independent transactions that can be called from within another transaction.”就是说它被一个事务调用的事务,但它独立于它的父事务提交或回滚。
下面看一个例子
首先创建一张测试表
www.2cto.com
[sql]
MIKE@ORA11G> create table test(m varchar2(30));
Table created.
创建两个procedure,一个是自治事务的,一个是非自治事务的
[sql]
create or replace procedure auto_proce
as
pragma autonomous_transaction;
begin
insert into test values('autonomous!');
commit;
end;
/
[sql]
create or replace procedure nonauto_proce
as www.2cto.com
begin
insert into test values('nonautonomous!');
commit;
end;
/
先调用nonauto_proce,看一下会发生什么?
[sql]
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;
www.2cto.com
M
------------------------------
test
nonautonomous!
第4行的rollback并没有回滚,由于nonauto_proce过程不是自治事务,它的提交将父事务中的insert一并提交,造成rollback没有回滚,即nonauto_proce影响了它的父事务。
下面再看一下auto_proce的情况。
[sql]
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;
www.2cto.com
M
------------------------------
autonomous!
由于auto_proce过程是自治事务,它的commit并没有影响到其父事务的rollback。从结果中,已经证明了这一点。
通过这个例子,可以看出自治事务对其父事务并不会造成任何影响。
自治事务一般会被用于:
a 匿名块
b 本地、对立或打包的函数或过程
c 对象类型的方法
d 触发器
2、自治事务与父事务(调用者)的关系
创建一个过程,在commit前休眠10秒,以便查看系统中的一些信息。
[sql]
create or replace procedure auto_p1
as
pragma AUTONOMOUS_TRANSACTION;
begin
insert into test values('test2');
dbms_lock.sleep(10);
commit;
end;
查看会话的SID(会话A)
www.2cto.com
[sql]
SQL> conn sys/admin as sysdba
已连接。
SQL> select sid from v$mystat where rownum=1;
SID
----------
144
通过sqlplus打开另一个连接(会话B),查看会话信息
[sql]
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
www.2cto.com
在会话A执行auto_p1
[sql]
SQL> begin
2 auto_p1;
3 end;
4 /
PL/SQL 过程已成功完成。
执行期间在会话B,查看会话信息
[sql]
SQL> select sid, username, status from v$session;
SID USERNAME STATUS
---------- ------------------------------ --------
143 SYS INACTIVE
144 SYS INACTIVE
145 SYS INACTIVE
147 SYS