自治事務前的事務管理(一般事務管理)
?? 像 DML 這樣的數據庫扣作都是在事務的上下文環境中執行的。事務是一個或多個 SQL 語句的序列,執行一定的工作邏輯單元。事務、定義的特定會話可以由 commit 和 rollback 操作進行控制。只要發生 commit 或 rollback 操作就會釋放鎖定資源的鎖。
自治事務的定義和使用
自治事務是將單一的、完整的事務分割為多個子事務。控制從主事務( MT )轉移到自治事務( AT )。一旦自治事務執行了,主事務就會恢復執行。自治事務獨立于主事務, COMMIT 和 ROLLBACK 的范圍僅僅限制在自治事務的上下文中。
自治事務的優點
1、? 代碼的模塊人程度更高而且更簡單。
2、? 在觸發器內執行 COMMIT
3、? 從執行 DML 的 SQL 中調用用戶自定義的函數。
將事務指定為自治事務
可以在代碼的聲明部分使用下面語句,以便在 PL/SQL 塊中定義一個自治事務:
PRAGMA?? AUTONOMOUS_TRANSACTION
其中 pragma 關鍵字的作用是通知 PL/SQL 編譯器,將聲明它的這個 PL/SQL 代碼塊分割為一個自治的或獨立的事務。定義自治事務時,要遵守以下幾條規則:
1 、如果 PL/SQL 塊是匿名的,那么該匿名 PL/SQL 塊必須是一個頂層塊。
2 、如果 PL/SQL 塊不是匿名的,那么它必須作為包或存儲過程序單元一部分的一個過程或函數。當在包中定義自治事務時,只有包中具體的函數或過程才能被指定為自治的的。
3 、 PL/SQL 塊也可以是存儲對象類型的一個方法
4 、 PL/SQL 塊也可以是一個數據庫觸發器
一個例子程序
create
or
replace
procedure writelog(
? vid number,errtext varchar2????
)
is
pragmaautonomous_transaction;?
--
定義事務
begin
?
insert
into t_log values(vid,errtext);
? commit;
end;
create
or
replace
procedure createuser(uid number ,vname varchar2,vsex varchar2)
is
begin
?? insertinto t_user values (uid,vname,vsex);
?? commit;
exception
? whenothersthen
??? writelog(sqlcode,sqlerrm);
??? rollback;?
end;
自治事務處理
主事務開始執行
主事務遇到一個對自治子程序的調用,這時主事務就暫停,將控制轉移到自治例程中
自治事務開始執行
自治事務執行 commit 或 rollback 操作,這將結束當前自治事務。
主事務恢復
主事務結束
自治事務的一些關鍵問題
1、? 帶 ALTER SESSION 的自治事務
自治事務應該與主事務共享一個會話,因此通過 ALTER SESSION 語句,對該會話的任何修改,對自治事務和主事務應該都是可見的。但自治事務執行與主事務不同的上下文中。任何從自治塊中引發的自治子程序調用都與自治事務共享相同的事務上下文。
2、? 自治事務與死鎖
必須以下面的這種方式定義自治事務:
? 不創建主事務對資源和鎖的死鎖。死鎖在自治事務試圖訪問一個被主事務占用的資源時發生,這時主事務會掛起,直到自治事務結束。自治事務死等主事務釋放資源,結果可能導致死鎖。
3、? 定義自治事務的條件
只有頂層匿名塊才能包括 PRAGMA? AUTONOMOUS_TRANSTRACTION
4、? COMMIT 或 ROLLBACK 行為與自治事務
自治事務是以 commit 或 rollback 語句結束的。因此,應該在自治事務程序的內部顯式地包含一個 commit 或 rollback 語句。如果沒有這樣做,任何一個未確定的事務都會回滾。這是一個事務級的回滾,而不是一個語句級的回滾。
5、? 異常與自治事務
當自治事務以一個異常的方式退出時,就發生一個事務級的回滾,自事事務中所有未確定的改變都會回滾 .
6、? 多自治事務
一個自治事務的上下文中,初始化多個自治事務。可以在一個自治塊內定義多個 commit 或 rollback 語句來完成這項任務,當包含一個 rollback 時,它就會屬于當前事務,而不屬于主事務。
7、? 自治事務的并發問題
自治事務與主事務是并發運行的,初始化文件 init.ora 中的 transactions 參數決定著每個會話中并發事務的數量。 .
8、? 通過自治事務和從 SQL 中調用用戶自定義函數
通過自治事務,可以從 SQL 中調用用戶自定義函數來執行 DML 操作。只需把用戶自定義函數定義為自治事務,函數就變為可從 SQL 中調用的。
9、? 自治事務和隔離等級
應該在自治事務中給出 commit 或 rollback 命令,一旦 commit 或 rollback 在自治事務內部執行,那些改變對主事務而言是可見。但是 oracle 也允許從主事務中通過設定主事務的隔離等級為 SERIALIZABLE ,而不是默認的 READ COMMITTED ,對主事務隱藏這些改變,這可以通過 Set TRANSCTION 語句完成,其語法如下:
Set transaction isolation level serializable;
關于隔離等級的問題,以下兩點值得注意:
1 當自治事務以 commit 或 rollback 而結束時,由自治事務造成的改變對主事務以外的其它事務是可見的 .
2 設置隔離等級為 serializable ,對主事務隱藏自治事務的變化。直到主事務提交,主事務一旦提交,自治事務中的改變對自治事務也就可見。
10、????????????? 什么是隔離級別
隔離級別是一種處理修改數據庫事務的方法,它影響到一個事務中的改變對另一個事務的可見性。 SQL92 中定義了 4 種隔離級別即:
?READ UNCOMMITTED
?REPEATABLE? READ
READ COMMOTTED
?SERIALIZABLE
些外 oracle 支持 READ COMMOTTED 和 SERIALIZABLE 兩種隔離級別
Read committed :這種設置是 oracle 默認的 , 它使 oracle 查詢可以看到查詢之前提將近的數據。換句話說,這種模式的事務是基于每句一致的事務集的。
Serializable : 這種設置意味著一個事務中的所有語句,都在操作一個事務開始時的數據庫映像中,這意味著沒有 commit 之前,當前事務都不能看到其它事務所提交的數據。