自治事務參考

2021-10-10 06:24:33 字數 1538 閱讀 8825

在觸發器中操作觸發此觸發器的表,用

pragma autonomous_transaction 選項。

自治事務理解

一般情況下利用觸發器禁止某些對錶的更新等操作時,若記錄日誌,則觸發器最後丟擲異常時會造成日誌回滾。利用自治事務可防止此點。

對資料庫有寫操作(insert、update、delete、create、alter、commit)的儲存過程或函式是無法簡單的用sql來呼叫的,此時可以將其設為自治事務,從而避免ora-14552(無法在乙個查詢或dml中執行ddl、commit、rollback)、ora-14551(無法在乙個查詢中執行dml操作)等錯誤。需要注意的是函式必須有返回值,但僅有in引數(不能有out或in/out引數)。

在大型開發中,自治事務可以將**更加模組化,失敗或成功時不會影響呼叫者的其它操作,代價是呼叫者失去了對此模組的控制,並且模組內部無法引用呼叫者未提交的資料。

declare整個塊都是屬於父事務的,自治事務從離pragma後的第乙個begin開始,只要此begin塊仍在作用域則都屬於自治事務。

例如在declare模組中宣告乙個寫資料庫的函式,則此函式雖然在自治事務所在儲存過程執行,但其屬於父事務;而自治事務中呼叫的任何函式和儲存過程、激發的任何觸發器等均為此自治事務的一部分。

自治事務可以巢狀,巢狀深度等只受init.ora引數transactions(同時併發的事務數,預設為sessions的1.1倍)制約。

自治事務可看到並修改父事務的變數,父事務也會察覺到這一改變,且不存在回滾問題。

自治事務與父事務共享同乙個會話環境,通過alter session作的修改對整個會話均有效。但set transaction是事務級的,僅對提起修改的事務有效。

父事務已提交的修改對自治事務可見,未提交的對自治事務不可見,自治事務的修改對父事務是否可見取決於隔離級別(isolation level)。

對於游標,取決於其開啟的位置,若其在父事務中開啟,則之前父事務未提交的修改對其是有效的,在自治事務中這些修改也可見;而在自治事務中開啟,則父事務未提交的修改不可見。

若使用預設的read committed隔離級別,則自治事務的修改對父事務可見;若改用serializable,則不可見。

父事務與自治事務是完全不同的事務,因此無法共享鎖等。

結束乙個自治事務必須提交乙個commit、rollback或執行ddl。

儲存點無法在自治事務中回滾到父事務中的乙個儲存點,只能在內部使用儲存點。

15.3 最後說明 不支援分布式事務截至8.1.7在自治事務中不支援分布式事務

僅可用pl/sql 全部事務回滾若自治事務出錯,則全部回滾,即便父事務有異常處理模組。

事務級臨時表每個會話僅乙個事務可訪問事務級臨時表(多個會話中的事務可併發操作)。

15.4 可能遇到的錯誤

ora-06519 – 檢查到活動自治事務,回滾——退出自治事務時沒有提交、回滾或ddl操作

ora-14450 – 試圖訪問正在使用的事務級臨時表

ora-00060 – 等待資源時檢查到死鎖

oracle的自治事務

create or replace procedure testa a varchar2,b varchar2 is vs str varchar2 10 begin insert into test table t values a vs str b testb bs str rollback e...

觸發器 自治事務

原帖位址 問題如下 表 ksource.userinfo 發生了變化,觸發器 函式不能讀它 userinfo userid,username,departid,serialnum,對於乙個部門 departid相同 下的使用者,我要讓其序號serialnum保持連續,就建立了乙個觸發器 引用 cre...

Seata 乙個簡單可擴充套件自治事務架構

乙個高效能,易於上手的,用於微服務架構的分布式事務解決方案。微服務中的分布式事務問題傳統的單體應用,它的業務元件通常有3個模組。它使用乙個單體的本地資料來源,通常地,使用本地事務保證資料一致性。在微服務中就會變得不一樣了,上面提到的3個模組將拆分成3個不同的資料來源。每個單體的服務自然可以使用本地事...