Oracle筆記-自治事務
2024-08-29 13:37:16
供稿:網友
 
               第 15 章 自治事務  DECLARE  PRAGMA AUTONOMOUS_TRANSACTION;  15.1 為何使用自治事務  無法回滾的審計                                                                                              一般情況下利用觸發器禁止某些對表的更新等操作時,若記錄日志,則觸發器最后拋出異常時會造成日志回滾。利用自治事務可防止此點?! ”苊庾儺惐怼 〖丛谟|發器中操作觸發此觸發器的表  在觸發器中使用DDL  寫數據庫  對數據庫有寫操作(INSERT、UPDATE、DELETE、CREATE、ALTER、COMMIT)的存儲過程或函數是無法簡單的用SQL來調用的,此時可以將其設為自治事務,從而避免ORA-14552(無法在一個查詢或DML中執行DDL、COMMIT、ROLLBACK)、ORA- 14551(無法在一個查詢中執行DML操作)等錯誤。需要注重的是函數必須有返回值,但僅有IN參數(不能有OUT或IN/OUT參數)。  開發更模塊化的代碼  在大型開發中,自治事務可以將代碼更加模塊化,失敗或成功時不會影響調用者的其它操作,代價是調用者失去了對此模塊的控制,并且模塊內部無法引用調用者未提交的數據。  15.2 如何工作  事務控制  DECLARE整個塊都是屬于父事務的,自治事務從離PRAGMA后的第一個BEGIN開始,只要此BEGIN塊仍在作用域,則都屬于自治事務。例如在 DECLARE模塊中聲明一個寫數據庫的函數,則此函數雖然在自治事務所在存儲過程執行,但其屬于父事務;而自治事務中調用的任何函數和存儲過程、激發的任何觸發器等均為此自治事務的一部分?! ∽灾问聞湛梢郧短祝短咨疃鹊戎皇躀NIT.ORA參數TRANSACTIONS(同時并發的事務數,缺省為sessionS的1.1倍)制約?! ∽饔糜颉 ?.      包中的變量  自治事務可看到并修改父事務的變量,父事務也會察覺到這一改變,且不存在回滾問題?! ?.      會話設置/參數  自治事務與父事務共享同一個會話環境,通過ALTER SESSION作的修改對整個會話均有效。但SET TRANSACTION是事務級的,僅對提起修改的事務有效?! ?.      數據庫修改  父事務已提交的修改對自治事務可見,未提交的對自治事務不可見,自治事務的修改對父事務是否可見取決于隔離級別(Isolation Level)?! τ谟螛?,取決于其打開的位置,若其在父事務中打開,則之前父事務未提交的修改對其是有效的,在自治事務中這些修改也可見;而在自治事務中打開,則父事務未提交的修改不可見?! ∪羰褂萌笔〉腞EAD COMMITTED隔離級別,則自治事務的修改對父事務可見;若改用SERIALIZABLE,則不可見?! ?.      鎖  父事務與自治事務是完全不同的事務,因此無法共享鎖等。  結束一個自治事務  必須提交一個COMMIT、ROLLBACK或執行DDL.  保存點  無法在自治事務中回滾到父事務中的一個保存點,只能在內部使用保存點。  15.3 最后說明  不支持分布式事務  截至8.1.7在自治事務中不支持分布式事務  僅可用PL/SQL  全部事務回滾  若自治事務出錯,則全部回滾,即便父事務有異常處理模塊?! ∈聞占壟R時表  每個會話僅一個事務可訪問事務級臨時表(多個會話中的事務可并發操作)?! ∽儺惐?STRONG>  15.4 可能碰到的錯誤  ORA-06519 – 檢查到活動自治事務,回滾——退出自治事務時沒有提交、回滾或DDL操作  ORA-14450 – 試圖訪問正在使用的事務級臨時表  ORA-00060 – 等待資源時檢查到死鎖