Oracle自主事務處理

oracle 自主事務處理怎麼理解,沒有自主事務處理會有什麼弊端呢?

2013-03-22 10:20 4358673ym | 分類:數據庫DB
 
 
2013-03-22 10:26 提問者採納
熱心網友
自主事務處理, 就是 我這個存儲過程裏面,  本身管理事務處理。

我本身的對數據做了修改, 提交了,那麼就提交了。
無視外部的事務, 是否提交或者回滾。

這個主要用於一些特殊的狀況, 例如 安全審覈記錄的處理。
例如 有人要更新某個 很重要的表。
那麼我要記錄這個 更新的日誌信息。 是誰,什麼時間,什麼機器更新的。

不管這我的, 本次更新操做是否成功, 我都要記錄。

沒有自主事務處理的狀況下, 上面這種狀況。

若是那我的更新成功了, 那麼個人日誌也成功。
若是那我的, 更新了, 而後 roolback 了, 那麼個人日誌也 回滾了。

SQL> select * from test_main;

ID VALUE
---------- --------------------
2 TWO
3 THREE
1 ONE

SQL> CREATE OR REPLACE PROCEDURE Autonomous_Insert
2 AS
3 -- 定義 「自治事務」
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6 INSERT INTO test_main(id, value) VALUES (5, 'FIVE');
7 COMMIT;
8 END;
9 /

Procedure created.

SQL> BEGIN
2 -- 非自治事務的語句.
3 INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
4 -- 自治事務
5 Autonomous_Insert;
6 -- 非自治事務回滾,不影響自治事務.
7 rollback;
8 END;
9 /

PL/SQL procedure successfully completed.

SQL> select * from test_main;

ID VALUE
---------- --------------------
5 FIVE
2 TWO
3 THREE
1 ONE
 

    1. --當一個子程序調用另一個子程序時,事務提交或回滾都將影響兩個子程序  
    2. --爲防止一個子程序的事務影響其餘子程序,能夠將這個子程序標記爲自主事務處理  
    3. --這樣自主事務成爲一個獨立的事務處理,不影響其餘子程序的事務  
    4. --pragma autonomous_transaction 用於標記子程序爲自主事務處理  
    5.   
    6. --自主事務過程  
    7. create or replace procedure proc_tran1  
    8. as  
    9.   v_sal emp.sal%type;  
    10.   pragma autonomous_transaction;--指定爲自主事務  
    11. begin  
    12.   select sal into v_sal from emp where empno=7788;  
    13.   dbms_output.put_line('proc_tran1中顯示7788的薪水:'||v_sal);  
    14.   rollback;  --回滾事務  
    15. end;  
    16.   
    17. --主事務過程  
    18. create or replace procedure proc_tran2  
    19. as  
    20.     v_sal emp.sal%type;  
    21. begin  
    22.   update emp set sal=6666 where empno=7788;-- 修改7788薪水  
    23.   proc_tran1();--調用自主事務過程  
    24.   commit;  
    25.   select sal into v_sal from emp where empno=7788;  
    26.   dbms_output.put_line('proc_tran2中顯示7788的薪水:'||v_sal);  
    27. end

Oracle之自治事務

昨天處理項目中的一個業務需求要用到觸發器實現,觸發器中涉及到在 inserting、deleting、updating以後來觸發對錶的操做,對於inserting、updating中的操做均可以正常實現,就是 deleting的時候,要求更新其餘表,更新的值是對觸發器表自身的查詢操做,本人在有限的水平範圍以內試過N中方式來達到需求,最後無果,無奈之下只 有找經理幫忙看看問題,最終問題被解決了,果真是用到了本身不太熟悉的oracle自治事務,並且這個自治事務由於是獨立的事務操做,考慮到事務回滾,必 須單獨寫成一個觸發器來完成,最後問題被老大解決掉了,每次問題但願都是成長的機會,會有收穫,因而乎就到網上找了下自治事務(簡稱AT)相關方面的說明 及用法,下午就到園子裏來mark下,供本身學習及各位園友參考;html

一、自治事務使用狀況sql

沒法回滾的審計 : 通常狀況下利用觸發器禁止某些對錶的更新等操做時,若記錄日誌,則觸發器最後拋出異常時會形成日誌回滾。利用自治事務可防止此點。
避免變異表: 即在觸發器中操做觸發此觸發器的表
在 觸發器中使用ddl 寫數據庫:對數據庫有寫操做(insert、update、delete、create、alter、commit)的存儲過程或函數是沒法簡單的用 sql來調用的,此時能夠將其設爲自治事務,從而避免ora-14552(沒法在一個查詢或dml中執行ddl、commit、rollback)、 ora-14551(沒法在一個查詢中執行dml操做)等錯誤。須要注意的是函數必須有返回值,但僅有in參數(不能有out或in/out參數)。
開發更模塊化的代碼: 在大型開發中,自治事務能夠將代碼更加模塊化,失敗或成功時不會影響調用者的其它操做,代價是調用者失去了對此模塊的控制,而且模塊內部沒法引用調用者未提交的數據。數據庫

二、Oracle 自制事務是指的存儲過程和函數能夠本身處理內部事務不受外部事務的影響,用pragma autonomous_transaction來聲明,要建立一個自治事務,您必須在匿名塊的最高層或者存儲過程、函數、數據包或觸發的定義部分中,使用 PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION語句。在這樣的模塊或過程當中執行的SQL語句都是自治的。安全

create or replace procedure AutoNomouse_Insert is PRAGMA AUTONOMOUS_TRANSACTION; 
begin 
insert into Msg values('AutoNomouse Insert');   
commit;  
 end;

三、自治事務能夠嵌套,嵌套深度等只受init.ora參數transactions(同時併發的事務數,缺省爲sessions的1.1倍)制 約。由於自治事務是與主事務(簡稱MT)相分離的,因此它不能檢測到被修改過的行的當前狀態。這就好像在主事務提交以前,它們一直處於單獨的會話裏,對自 治事務來講,它們是不可用的。然而,反過來狀況就不一樣了:主事務可以檢測到已經執行過的自治事務的結果。session

四、若是AT試圖訪問被MT控制的資源,可能有deadlock發生.Package 不能被聲明爲AT,只有package所擁有的function和procedure 才能聲明爲AT。主事務與自治事務是徹底不一樣的事務,所以沒法共享鎖等。結束一個自治事務必須提交一個commit、rollback或執行ddl,不然會產生Oracle錯誤ORA-06519: active autonomous transaction detected and rolled back 。保存點沒法在自治事務中回滾到父事務中的一個保存點,只能在內部使用保存點。併發

五、可能遇到的錯誤
ora-06519 – 檢查到活動自治事務,回滾——退出自治事務時沒有提交、回滾或ddl操做
ora-14450 – 試圖訪問正在使用的事務級臨時表
ora-00060 – 等待資源時檢查到死鎖
oracle

相關文章
相關標籤/搜索