免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
ORACLE中的自治事務(wù)
 這是一個非常實用的功能,特別用在記錄錯誤日志同時要回滾主事務(wù)的時候,我們在實際開發(fā)中就是這么用的,感覺還是很方便的。轉(zhuǎn)載一篇詳細的介紹,感謝原作者。
 
在基于低版本的ORACLE做一些項目的過程中,有時會遇到一些頭疼的問題.,比如想在執(zhí)行當前一個由多個DML組成的transaction(事務(wù))時,為每一步DML記錄一些信息到跟蹤表中,由于事務(wù)的原子性,這些跟蹤信息的提交將決定于主事務(wù)的commit或rollback. 這樣一來寫程序的難度就增大了, 程序員不得不把這些跟蹤信息記錄到類似數(shù)組的結(jié)構(gòu)中,然后在主事務(wù)結(jié)束后把它們存入跟蹤表.哎,真是麻煩!
有沒有一個簡單的方法解決類似問題呢?
ORACLE8i的AUTONOMOUS TRANSACTION(自治事務(wù),以下AT)是一個很好的回答。
AT 是由主事務(wù)(以下MT)調(diào)用但是獨立于它的事務(wù)。在AT被調(diào)用執(zhí)行時,MT被掛起,在AT內(nèi)部,一系列的DML可以被執(zhí)行并且commit或rollback.
注意由于AT的獨立性,它的commit和rollback并不影響MT的執(zhí)行效果。在AT執(zhí)行結(jié)束后,主事務(wù)獲得控制權(quán),又可以繼續(xù)執(zhí)行了。
如何實現(xiàn)AT的定義呢?我們來看一下它的語法。其實非常簡單。
只需下列PL/SQL的聲明部分加上PRAGMAAUTONOMOUS_TRANSACTION就可以了。
可以加自治事務(wù)的有:
    1. 頂級的匿名PL/SQL塊
    2. Functions 或 Procedure(獨立聲明或聲明在package中都可)
    3. SQL Object Type的方法
  4. 觸發(fā)器。
比如: 
在一個獨立的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));
首先,用普通的事務(wù)寫個匿名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;
 
運行結(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   -> 主匿名塊最后’看到’了所有的記錄.
 
從這個例子中,我們看到COMMIT和ROLLBACK的位置無論是在主匿名塊中或者在子程序中,都會影響到整個當前事務(wù).
現(xiàn)在用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的記錄,但是主匿名塊中的記錄已經(jīng)被提前rollback了
local: # of rows is 3  -> 子程序local 中可以’看到’3條記錄包括主匿名塊commit的記錄
main: # of rows is 4   ->主匿名塊最后’看到’了所有的記錄.
 
很明顯,AT是獨立的,在它執(zhí)行時,MT被暫停了. AT的COMMIT,ROLLBACK并不影響MT的執(zhí)行.
 
運用AT時,有一些注意事項,簡單列舉如下:
1.    在匿名PL/SQL塊中,只有頂級的匿名PL/SQL塊可以被設(shè)為AT
2.    如果AT試圖訪問被MT控制的資源,可能有deadlock發(fā)生.
3.    Package 不能被聲明為AT,只有package所擁有的function和procedure 才能聲明為AT
4.    AT程序必須以commit 或rollback結(jié)尾,否則會產(chǎn)生Oracle錯誤ORA-06519: active autonomous transaction detected and rolled back
 
在程序開發(fā)時,如果充分運用AUTONOMOUS TRANSACTION的特性,一定能取得事倍功半的效果.
 
本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/fenglibing/archive/2009/04/10/4059924.aspx
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Oracle事務(wù)
Oracle PL/SQL開發(fā)基礎(chǔ)(第十三彈:提交和回滾記錄)
Oracle與SQLServer事務(wù)處理的比較
Oracle與SQL Server事務(wù)處理的比較 - 51CTO.COM
Oracle怎么顯式開啟事務(wù),開始事務(wù)跟鎖有什么關(guān)系,在存儲過程中有時怎么開啟和提交,回滾事務(wù)的
Oracle自治事務(wù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服