在觸發器中操作觸發此觸發器的表,用pragma autonomous_transaction選項。
1、為何使用自治事務
?無法回滾的審計 : 一般情況下利用觸發器禁止某些對表的更新等操作時,若記錄日志,則觸發器最后拋出異常時會造成日志回滾。利用自治事務可防止此點。
?避免變異表:????? 即在觸發器中操作觸發此觸發器的表
?在觸發器中使用ddl 寫數據庫:對數據庫有寫操作(insert、update、delete、create、alter、commit)的存儲過程或函數是無法簡單的用sql來調用的,
?????????????? 此時可以將其設為自治事務,從而避免ora-14552(無法在一個查詢或dml中執行ddl、commit、rollback)、ora-14551(無法在一個查詢中執行dml操作)等錯誤。
?????????????? 需要注意的是函數必須有返回值,但僅有in參數(不能有out或in/out參數)。
?開發更模塊化的代碼:? 在大型開發中,自治事務可以將代碼更加模塊化,失敗或成功時不會影響調用者的其它操作,
?????????????? 代價是調用者失去了對此模塊的控制,并且模塊內部無法引用調用者未提交的數據。
2、如何工作
??? 事務控制
?declare整個塊都是屬于父事務的,自治事務從離pragma后的第一個begin開始,只要此begin塊仍在作用域,則都屬于自治事務。
?例如在declare模塊中聲明一個寫數據庫的函數,則此函數雖然在自治事務所在存儲過程執行,但其屬于父事務;而自治事務中調用的任何函數和存儲過程、激發的任何觸發器等均為此自治事務的一部分。
?自治事務可以嵌套,嵌套深度等只受init.ora參數transactions(同時并發的事務數,缺省為sessions的1.1倍)制約。
?作用域
?2.1 包中的變量
?自治事務可看到并修改父事務的變量,父事務也會察覺到這一改變,且不存在回滾問題。
?2.2 會話設置/參數
?自治事務與父事務共享同一個會話環境,通過alter session作的修改對整個會話均有效。但set transaction是事務級的,僅對提起修改的事務有效。
?2.3 數據庫修改
?父事務已提交的修改對自治事務可見,未提交的對自治事務不可見,自治事務的修改對父事務是否可見取決于隔離級別(isolation level)。
?對于游標,取決于其打開的位置,若其在父事務中打開,則之前父事務未提交的修改對其是有效的,在自治事務中這些修改也可見;而在自治事務中打開,則父事務未提交的修改不可見。
?若使用缺省的read committed隔離級別,則自治事務的修改對父事務可見;若改用serializable,則不可見。
?2.4 鎖
?父事務與自治事務是完全不同的事務,因此無法共享鎖等。
?結束一個自治事務必須提交一個commit、rollback或執行ddl。
?保存點無法在自治事務中回滾到父事務中的一個保存點,只能在內部使用保存點。
3、最后說明 不支持分布式事務截至8.1.7在自治事務中不支持分布式事務
?僅可用pl/sql 全部事務回滾若自治事務出錯,則全部回滾,即便父事務有異常處理模塊。
?事務級臨時表每個會話僅一個事務可訪問事務級臨時表(多個會話中的事務可并發操作)。
4、可能遇到的錯誤
?ora-06519 – 檢查到活動自治事務,回滾——退出自治事務時沒有提交、回滾或ddl操作
?ora-14450 – 試圖訪問正在使用的事務級臨時表
?ora-00060 – 等待資源時檢查到死鎖
?本文來自csdn博客,轉載請標明出處: http://blog.csdn.net/alex197963/archive/2008/01/11/2036500.aspx
1、為何使用自治事務
?無法回滾的審計 : 一般情況下利用觸發器禁止某些對表的更新等操作時,若記錄日志,則觸發器最后拋出異常時會造成日志回滾。利用自治事務可防止此點。
?避免變異表:????? 即在觸發器中操作觸發此觸發器的表
?在觸發器中使用ddl 寫數據庫:對數據庫有寫操作(insert、update、delete、create、alter、commit)的存儲過程或函數是無法簡單的用sql來調用的,
?????????????? 此時可以將其設為自治事務,從而避免ora-14552(無法在一個查詢或dml中執行ddl、commit、rollback)、ora-14551(無法在一個查詢中執行dml操作)等錯誤。
?????????????? 需要注意的是函數必須有返回值,但僅有in參數(不能有out或in/out參數)。
?開發更模塊化的代碼:? 在大型開發中,自治事務可以將代碼更加模塊化,失敗或成功時不會影響調用者的其它操作,
?????????????? 代價是調用者失去了對此模塊的控制,并且模塊內部無法引用調用者未提交的數據。
2、如何工作
??? 事務控制
?declare整個塊都是屬于父事務的,自治事務從離pragma后的第一個begin開始,只要此begin塊仍在作用域,則都屬于自治事務。
?例如在declare模塊中聲明一個寫數據庫的函數,則此函數雖然在自治事務所在存儲過程執行,但其屬于父事務;而自治事務中調用的任何函數和存儲過程、激發的任何觸發器等均為此自治事務的一部分。
?自治事務可以嵌套,嵌套深度等只受init.ora參數transactions(同時并發的事務數,缺省為sessions的1.1倍)制約。
?作用域
?2.1 包中的變量
?自治事務可看到并修改父事務的變量,父事務也會察覺到這一改變,且不存在回滾問題。
?2.2 會話設置/參數
?自治事務與父事務共享同一個會話環境,通過alter session作的修改對整個會話均有效。但set transaction是事務級的,僅對提起修改的事務有效。
?2.3 數據庫修改
?父事務已提交的修改對自治事務可見,未提交的對自治事務不可見,自治事務的修改對父事務是否可見取決于隔離級別(isolation level)。
?對于游標,取決于其打開的位置,若其在父事務中打開,則之前父事務未提交的修改對其是有效的,在自治事務中這些修改也可見;而在自治事務中打開,則父事務未提交的修改不可見。
?若使用缺省的read committed隔離級別,則自治事務的修改對父事務可見;若改用serializable,則不可見。
?2.4 鎖
?父事務與自治事務是完全不同的事務,因此無法共享鎖等。
?結束一個自治事務必須提交一個commit、rollback或執行ddl。
?保存點無法在自治事務中回滾到父事務中的一個保存點,只能在內部使用保存點。
3、最后說明 不支持分布式事務截至8.1.7在自治事務中不支持分布式事務
?僅可用pl/sql 全部事務回滾若自治事務出錯,則全部回滾,即便父事務有異常處理模塊。
?事務級臨時表每個會話僅一個事務可訪問事務級臨時表(多個會話中的事務可并發操作)。
4、可能遇到的錯誤
?ora-06519 – 檢查到活動自治事務,回滾——退出自治事務時沒有提交、回滾或ddl操作
?ora-14450 – 試圖訪問正在使用的事務級臨時表
?ora-00060 – 等待資源時檢查到死鎖
?本文來自csdn博客,轉載請標明出處: http://blog.csdn.net/alex197963/archive/2008/01/11/2036500.aspx
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
