分享
 
 
 

AUTONOMOUS TRANSACTION(自治事务)的介绍

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题.,比如想在执行当前一个由多个DML组成的transaction(事务)时,为每一步DML记录一些信息到跟踪表中,由于事务的原子性,这些跟踪信息的提交将决定于主事务的commit或rollback. 这样一来写程序的难度就增大了, 程序员不得不把这些跟踪信息记录到类似数组的结构中,然后在主事务结束后把它们存入跟踪表.哎,真是麻烦!

有没有一个简单的方法解决类似问题呢?

ORACLE8i的AUTONOMOUS TRANSACTION(自治事务,以下AT)是一个很好的回答。

AT 是由主事务(以下MT)调用但是独立于它的事务。在AT被调用执行时,MT被挂起,在AT内部,一系列的DML可以被执行并且commit或rollback.

注意由于AT的独立性,它的commit和rollback并不影响MT的执行效果。在AT执行结束后,主事务获得控制权,又可以继续执行了。

见图1:

图1:

如何实现AT的定义呢?我们来看一下它的语法。其实非常简单。

只需下列PL/SQL的声明部分加上PRAGMA AUTONOMOUS_TRANSACTION 就可以了。

1. 顶级的匿名PL/SQL块

2. Functions 或 Procedure(独立声明或声明在package中都可)

3. SQL Object Type的方法

4. 触发器。

比如:

在一个独立的procedure中声明AT

CREATE OR REPLACE PROCEDURE

Log_error(error_msg IN VARCHAR2(100))

IS

PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

Insert into Error_log values ( sysdate,error_msg);

COMMIT;

END;

下面我们来看一个例子,(win2000 advanced server + oracle8.1.6 , connect as scott)

建立一个表:

create table msg (msg varchar2(120));

首先,用普通的事务写个匿名PL/SQL块:

declare

cnt number := -1; --} Global variables

procedure local is

begin

select count(*) into cnt from msg;

dbms_output.put_line('local: # of rows is '||cnt);

insert into msg values ('New Record');

commit;

end;

begin

delete from msg ;

commit;

insert into msg values ('Row 1');

local;

select count(*) into cnt from msg;

dbms_output.put_line('main: # of rows is '||cnt);

rollback;

local;

insert into msg values ('Row 2');

commit;

local;

select count(*) into cnt from msg;

dbms_output.put_line('main: # of rows is '||cnt);

end;

运行结果(注意打开serveroutput)

local: # of rows is 1 -> 子程序local中可以’看到’主匿名块中的uncommitted记录

main: # of rows is 2 -> 主匿名块可以’看到’2条记录(它们都是被local commit掉的)

local: # of rows is 2 -> 子程序local首先’看到’2条记录,然后又commit了第三条记录

local: # of rows is 4 -> 子程序local又’看到’了新增加的记录(它们都是被local commit掉的),然后又commit了第五条记录

main: # of rows is 5 -> 主匿名块最后’看到’了所有的记录.

从这个例子中,我们看到COMMIT和ROLLBACK的位置无论是在主匿名块中或者在子程序中,都会影响到整个当前事务.

现在用AT改写一下匿名块中的procedure local:

...

procedure local is

pragma AUTONOMOUS_TRANSACTION;

begin

...

重新运行(注意打开serveroutput)

local: # of rows is 0 -> 子程序local中无法可以’看到’主匿名块中的uncommitted记录 (因为它是独立的)

main: # of rows is 2 -> 主匿名块可以’看到’2条记录,但只有一条是被commited.

local: # of rows is 1 -> 子程序local中可以’看到’它前一次commit的记录,但是主匿名块中的记录已经被提前rollback了

local: # of rows is 3 -> 子程序local 中可以’看到’3条记录包括主匿名块commit的记录

main: # of rows is 4 ->主匿名块最后’看到’了所有的记录.

很明显,AT是独立的,在它执行时,MT被暂停了. AT的COMMIT,ROLLBACK并不影响MT的执行.

运用AT时,有一些注意事项,简单列举如下:

1. 在匿名PL/SQL块中,只有顶级的匿名PL/SQL块可以被设为AT

2. 如果AT试图访问被MT控制的资源,可能有deadlock发生.

3. Package 不能被声明为AT,只有package所拥有的function和procedure 才能声明为AT

4. AT程序必须以commit 或rollback结尾,否则会产生Oracle错误ORA-06519: active autonomous transaction detected and rolled back

在程序开发时,如果充分运用AUTONOMOUS TRANSACTION的特性,一定能取得事倍功半的效果.

参考资料:

metalink.oracle.com

oracle8i manual

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有