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

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