一注竿、摘要
嵌套事物:指在一個Parent事務(wù)中嵌套的一個或多個Sub Transaction.并且主事務(wù)與其相互影響,這種事務(wù)就稱為嵌套事務(wù)蔓搞。以Commit作為事務(wù)的結(jié)束
自治事物:指在function胰丁,procedure等subprograms中對事務(wù)進(jìn)行自治管理,當(dāng)在別的pl/sql block里去調(diào)用這些subprograms的時候這些subprograms并不隨著父pl/sql block的失敗而回滾,而是自己管自己commit喂分。以Commit作為事務(wù)的結(jié)束。自治事務(wù)常用于寫入LOG或TRAC信息便于查找錯誤蒲祈。
個人感覺甘萧,一般嵌套事物因為采用savepoint&rollback這種方式進(jìn)行回滾梆掸,會破壞程式的可讀性及模塊化扬卷,特別有多個savepoint&rollback在程式中,可能連自己寫的人會混淆酸钦,更何況項目運(yùn)維過程中的維護(hù)人員怪得,所以一般在寫程式標(biāo)準(zhǔn)中,會禁止使用嵌套事物
而自治事物可將程式的模塊化卑硫,一般來說是推薦的寫法徒恋,將主事物和子事物進(jìn)行隔離,所以后面也會對自治事物做詳細(xì)的解讀
二欢伏、嵌套事物 SavePoint
1. 基本作用:建立回滾節(jié)點入挣,之后如回滾直接回滾此節(jié)點,此節(jié)點之前仍會Commit
2. 基本語法
SAVE_POINT my_savepoint;
... ...
ROLLBACK to my_savepoint;
3. 因是開發(fā)過程中不推薦的寫法硝拧,所以案列就略去了;)
三径筏、自治事物 autonomous_transation
1. 基本作用:
當(dāng)proc1調(diào)用proc2后,proc1執(zhí)行Rollback后障陶,proc2仍舊會進(jìn)行Commit;
采用的基本語法是在申明proc2時加入 pragma autonomous_transaction;
2. 基本語法
申明proc2為自治事務(wù)
<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> 1 create or replace procedure proc2 23 as pragma autonomous_transaction; 45 begin
67 insert into log_info values (user, sysdate, 'insert');
89 commit; 10
11 end;</pre>
3. 自治事務(wù)的一個例子
3.1 申明一個自治事物xxautonomouse_insert
<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> 1 procedure xxautonomouse_insert is
2
3 pragma autonomous_transaction;
4
5 begin
6
7 insert into xxap_viktor_autonomous 8
9 values(001, 'xxap_invoice_20140410_01'); 10
11 commit; --自治事務(wù)中commit
12
13 end;</pre>
3.2 申明一個主事物滋恬,在主事物中調(diào)用自治事物,
<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> 1 procedure xxautonomouse_main is
2
3 begin
4
5 xxautonomouse_insert;
6
7 insert into xxap_viktor_autonomous 8
9 values(002, 'xxap_invoice_20140410_02'); 10
11 rollback; --主事務(wù)中rollback
12
13 end; </pre>
3.3 在主事物中進(jìn)行rollback咸这,并不影響自治事務(wù)的commit和rollback夷恍,實現(xiàn)了事物間的隔離
4. 自治事務(wù)的概念
(1) 帶 ALTER SESSION 的自治事務(wù) 自治事務(wù)應(yīng)該與主事務(wù)共享一個會話,因此通過 ALTER SESSION 語句,對該會話的任何修改酿雪,對自治事務(wù)和主事務(wù)應(yīng)該都是可見的遏暴。但自治事務(wù)執(zhí)行與主事務(wù)不同的上下文中。任何從自治塊中引發(fā)的自治子程序調(diào)用都與自治事務(wù)共享相同的事務(wù)上下文
(2) 自治事務(wù)與死鎖 必須以下面的這種方式定義自治事務(wù): 死鎖在自治事務(wù)試圖訪問一個被主事務(wù)占用的資源時發(fā)生指黎,這時主事務(wù)會掛起朋凉,直到自治事務(wù)結(jié)束。自治事務(wù)死等主事務(wù)釋放資源醋安,結(jié)果可能導(dǎo)致死鎖
(3) 定義自治事務(wù)的條件 只有頂層匿名塊才能包括 PRAGMA AUTONOMOUS_TRANSTRACTION(4) COMMIT 或 ROLLBACK 行為與自治事務(wù) 自治事務(wù)是以 commit 或 rollback 語句結(jié)束的杂彭。因此,應(yīng)該在自治事務(wù)程序的內(nèi)部顯式地包含一個 commit 或 rollback 語句吓揪。如果沒有這樣做亲怠,任何一個未確定的事務(wù)都會回滾。這是一個事務(wù)級的回滾柠辞,而不是一個語句級的回滾
(5) 異常與自治事務(wù) 當(dāng)自治事務(wù)以一個異常的方式退出時团秽,就發(fā)生一個事務(wù)級的回滾,自治事務(wù)中所有未確定的改變都會回滾
(6) 多個自治事務(wù) 一個自治事務(wù)的上下文中叭首,初始化多個自治事務(wù)习勤。可以在一個自治塊內(nèi)定義多個 commit 或 rollback 語句來完成這項任務(wù)焙格,當(dāng)包含一個 rollback 時图毕,它就會屬于當(dāng)前事務(wù),而不屬于主事務(wù)
(7) 自治事務(wù)的并發(fā)問題 自治事務(wù)與主事務(wù)是并發(fā)運(yùn)行的眷唉,初始化文件 init.ora 中的 transactions 參數(shù)決定著每個會話中并發(fā)事務(wù)的數(shù)量