了解oracle自治事务(二)
ACTIVE
149 ACTIVE
151 ACTIVE
157 ACTIVE
160 ACTIVE
161 ACTIVE
162 ACTIVE
163 ACTIVE
并没有看到新的会话产生,即自治事务auto_p1与其父事务(匿名块)在同一会话中。
www.2cto.com
3、应用场景
在Tom大师的《Oracle
编程艺术》中,提到了这方面的内容 – 记录错误日志或者消息。想想做过的项目中,的确
自治事务主要应用在这方面比较多,不管你的请求是否成功,只要访问到
数据库,就要记录在案,使用自治事务是
一种比较不错的方案(当然还有其他方案,因为此处只说自治事务,其他方案略过)。
下面使用一个简单的例子,说明一下。
创建两张表,一张测试表(有主键),一张是测试表的错误日志信息表。
[sql]
SQL> create table test1
( id number(8),
msg varchar2(10),
constraint test1_pk primary key(id)
);
表已创建。
[sql]
SQL> create table test1_log
2 ( dat timestamp,
3 err clob
4 );
表已创建。
创建自治事务,用于记录操作测试表时出现的错误信息。
[sql]
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 / www.2cto.com
过程已创建。
创建一个过程用于向测试进行插入操作。
[sql]
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]
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]
SQL> select * from test1_log;
www.2cto.com
未选定行
错误日志表中没有信息,测试表中的数据都是正确的。
下面再进行插入操作(违反测试表的主键约束,出现错误的情况)。
[sql]
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]
SQL> set linesize 1000
SQL> select * from test1_log;
www.2cto.com
DAT ERR
--------------------------------------------------------------------------- -------------------------------------------
30-7月 -12 07.55.26.281000 下午 ORA-06512: 在 "SYS.INSERT_TEST", line 4
ORA-06512: 在 line 2
插入操作没有成功,测试表没有新插入的数据,但是错误日志表中,记录个这次插入操作的错误信息。
上面的例子非常简单,运用到应用系统中,还需要根据系统的需求进行改造。
作者 IndexMan