昨天處理項目中的一個業務需求要用到觸發器實現,觸發器中涉及到在 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