国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

AUTONOMOUS TRANSACTION(自治事務(wù))的介紹

2024-07-21 02:08:33
字體:
供稿:網(wǎng)友

 

 

在基于低版本的oracle做一些項(xiàng)目的過程中,有時(shí)會(huì)遇到一些頭疼的問題.,比如想在執(zhí)行當(dāng)前一個(gè)由多個(gè)dml組成的transaction(事務(wù))時(shí),為每一步dml記錄一些信息到跟蹤表中,由于事務(wù)的原子性,這些跟蹤信息的提交將決定于主事務(wù)的commit或rollback. 這樣一來寫程序的難度就增大了, 程序員不得不把這些跟蹤信息記錄到類似數(shù)組的結(jié)構(gòu)中,然后在主事務(wù)結(jié)束后把它們存入跟蹤表.哎,真是麻煩!

有沒有一個(gè)簡(jiǎn)單的方法解決類似問題呢?

oracle8i的autonomous transaction(自治事務(wù),以下at)是一個(gè)很好的回答。

at 是由主事務(wù)(以下mt)調(diào)用但是獨(dú)立于它的事務(wù)。在at被調(diào)用執(zhí)行時(shí),mt被掛起,在at內(nèi)部,一系列的dml可以被執(zhí)行并且commit或rollback.

注意由于at的獨(dú)立性,它的commit和rollback并不影響mt的執(zhí)行效果。在at執(zhí)行結(jié)束后,主事務(wù)獲得控制權(quán),又可以繼續(xù)執(zhí)行了。

見圖1:

 

圖1:

 

如何實(shí)現(xiàn)at的定義呢?我們來看一下它的語法。其實(shí)非常簡(jiǎn)單。

只需下列pl/sql的聲明部分加上pragma autonomous_transaction 就可以了。

1.  頂級(jí)的匿名pl/sql塊

2.  functions 或 procedure(獨(dú)立聲明或聲明在package中都可)

3.  sql object type的方法

4.  觸發(fā)器。

 

    

 

 

比如:

 

在一個(gè)獨(dú)立的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;

 

下面我們來看一個(gè)例子,(win2000 advanced server + oracle8.1.6 , connect as scott)

建立一個(gè)表:

create table msg (msg varchar2(120));

首先,用普通的事務(wù)寫個(gè)匿名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;

 

運(yùn)行結(jié)果(注意打開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    -> 主匿名塊最后’看到’了所有的記錄.

 

 

從這個(gè)例子中,我們看到commit和rollback的位置無論是在主匿名塊中或者在子程序中,都會(huì)影響到整個(gè)當(dāng)前事務(wù).

 

 

 

 

 

現(xiàn)在用at改寫一下匿名塊中的procedure local:

...

   procedure local is

      pragma autonomous_transaction;

   begin

...

 

重新運(yùn)行(注意打開serveroutput)

local: # of rows is 0   -> 子程序local中無法可以’看到’主匿名塊中的uncommitted記錄 (因?yàn)樗仟?dú)立的)

main: # of rows is 2    -> 主匿名塊可以’看到’2條記錄,但只有一條是被commited.

local: # of rows is 1   -> 子程序local中可以’看到’它前一次commit的記錄,但是主匿名塊中的記錄已經(jīng)被提前rollback了

local: # of rows is 3   -> 子程序local 中可以’看到’3條記錄包括主匿名塊commit的記錄

main: # of rows is 4    ->主匿名塊最后’看到’了所有的記錄.

 

很明顯,at是獨(dú)立的,在它執(zhí)行時(shí),mt被暫停了. at的commit,rollback并不影響mt的執(zhí)行.

 

運(yùn)用at時(shí),有一些注意事項(xiàng),簡(jiǎn)單列舉如下:

1.     在匿名pl/sql塊中,只有頂級(jí)的匿名pl/sql塊可以被設(shè)為at

2.     如果at試圖訪問被mt控制的資源,可能有deadlock發(fā)生.

3.     package 不能被聲明為at,只有package所擁有的function和procedure 才能聲明為at

4.     at程序必須以commit 或rollback結(jié)尾,否則會(huì)產(chǎn)生oracle錯(cuò)誤ora-06519: active autonomous transaction detected and rolled back

 

在程序開發(fā)時(shí),如果充分運(yùn)用autonomous transaction的特性,一定能取得事倍功半的效果.

 

 

參考資料:

metalink.oracle.com

oracle8i manual

 
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 冕宁县| 西乡县| 新绛县| 桦甸市| 肇源县| 内黄县| 邮箱| 内江市| 南丹县| 桓台县| 江永县| 陵水| 佳木斯市| 社旗县| 阳新县| 遵义县| 鱼台县| 博爱县| 巴彦县| 随州市| 西乌| 中方县| 高安市| 木兰县| 昆明市| 女性| 兴化市| 澜沧| 内黄县| 马鞍山市| 蛟河市| 台中市| 鹿泉市| 广平县| 洪洞县| 克东县| 东乡县| 巴东县| 会宁县| 滦平县| 乌苏市|