自治事務 PRAGMA AUTONOMOUS TRANSACTION
阿新 • • 發佈:2018-12-20
在觸發器中操作觸發此觸發器的表,用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模組中宣告一個寫資料庫的函式,則此函式雖然在自治事務所在儲存過程執行,但其屬於父事務;而自治事務中呼叫的任何函式和儲存過程、激發的任何觸發器等均為此自治事務的一部分。自治事務可以巢狀,巢狀深度等只受INIT.ORA引數TRANSACTIONS(同時併發的事務數,預設為SESSIONS的1.1倍)制約。作用域1. 包中的變數自治事務可看到並修改父事務的變數,父事務也會察覺到這一改變,且不存在回滾問題。2. 會話設定/引數自治事務與父事務共享同一個會話環境,通過ALTER SESSION作的修改對整個會話均有效。但SET TRANSACTION是事務級的,僅對提起修改的事務有效。3. 資料庫修改父事務已提交的修改對自治事務可見,未提交的對自治事務不可見,自治事務的修改對父事務是否可見取決於隔離級別(Isolation Level)。 對於遊標,取決於其開啟的位置,若其在父事務中開啟,則之前父事務未提交的修改對其是有效的,在自治事務中這些修改也可見;而在自治事務中開啟,則父事務未提交的修改不可見。若使用預設的READ COMMITTED隔離級別,則自治事務的修改對父事務可見;若改用SERIALIZABLE,則不可見。4. 鎖父事務與自治事務是完全不同的事務,因此無法共享鎖等。結束一個自治事務必須提交一個COMMIT、ROLLBACK或執行DDL。儲存點無法在自治事務中回滾到父事務中的一個儲存點,只能在內部使用儲存點。15.3 最後說明 不支援分散式事務截至8.1.7在自治事務中不支援分散式事務僅可用PL/SQL 全部事務回滾若自治事務出錯,則全部回滾,即便父事務有異常處理模組。事務級臨時表每個會話僅一個事務可訪問事務級臨時表(多個會話中的事務可併發操作)。15.4 可能遇到的錯誤ORA-06519 – 檢查到活動自治事務,回滾——退出自治事務時沒有提交、回滾或DDL操作ORA-14450 – 試圖訪問正在使用的事務級臨時表ORA-00060 – 等待資源時檢查到死鎖