Oracle自主事務處理

2022-07-29 09:15:09 字數 4358 閱讀 5552

2013-03-22 10:20

4358673ym

|分類:資料庫db

分享到:

2013-03-22 10:26

提問者採納

熱心網友

自主事務處理, 就是 我這個儲存過程裡面,  自己管理事務處理。

我自己的對資料作了修改, 提交了,那麼就提交了。

無視外部的事務, 是否提交或者回滾。

這個主要用於一些特殊的情況, 例如 安全審核記錄的處理。

例如 有人要更新某個 很重要的表。

那麼我要記錄這個 更新的日誌資訊。 是誰,什麼時間,什麼機器更新的。

無論這個人, 本次更新操作是否成功, 我都要記錄。

沒有自主事務處理的情況下, 上面這種情況。

如果那個人更新成功了, 那麼我的日誌也成功。

如果那個人, 更新了, 然後 roolback 了, 那麼我的日誌也 回滾了。

sql> select * from test_main;

id value

---------- --------------------

2 two

3 three

1 one

sql> create or replace procedure autonomous_insert

2 as

3 -- 定義 「自治事務」

4 pragma autonomous_transaction;

5 begin

6 insert into test_main(id, value) values (5, 'five');

7 commit;

8 end;

9 /

procedure created.

sql> begin

2 -- 非自治事務的語句.

3 insert into test_main(id, value) values (4, 'four');

4 -- 自治事務

5 autonomous_insert;

6 -- 非自治事務回滾,不影響自治事務.

7 rollback;

8 end;

9 /

pl/sql procedure successfully completed.

sql> select * from test_main;

id value

---------- --------------------

5 five

2 two

3 three

1 one

[sql]view plain

copy

--當乙個子程式呼叫另外乙個子程式時,事務提交或回滾都將影響兩個子程式

--為防止乙個子程式的事務影響其他子程式,可以將這個子程式標記為自主事務處理

--這樣自主事務成為乙個獨立的事務處理,不影響其他子程式的事務

--pragma autonomous_transaction 用於標記子程式為自主事務處理

--自主事務過程

create

orreplace

procedure

proc_tran1  

asv_sal emp.sal%type;  

pragma autonomous_transaction;--指定為自主事務

begin

select

sal 

into

v_sal 

from

emp 

where

empno=7788;  

dbms_output.put_line('proc_tran1中顯示7788的薪水:'

||v_sal);  

rollback

;  --回滾事務

end;  

--主事務過程

create

orreplace

procedure

proc_tran2  

asv_sal emp.sal%type;  

begin

update

emp 

setsal=6666 

where

empno=7788;

-- 修改7788薪水

proc_tran1();--呼叫自主事務過程

commit

;  select

sal 

into

v_sal 

from

emp 

where

empno=7788;  

dbms_output.put_line('proc_tran2中顯示7788的薪水:'

||v_sal);  

end; 

昨天處理專案中的乙個業務需求要用到觸發器實現,觸發器中涉及到在 inserting、deleting、updating之後來觸發對錶的操作,對於inserting、updating中的操作都可以正常實現,就是 deleting的時候,要求更新其他表,更新的值是對觸發器表自身的查詢操作,本人在有限的水平範圍之內試過n中方式來達到需求,最後無果,無奈之下只 有找經理幫忙看看問題,最終問題被解決了,果然是用到了自己不太熟悉的oracle自治事務,而且這個自治事務因為是獨立的事務操作,考慮到事務回滾,必 須單獨寫成乙個觸發器來完成,最後問題被老大解決掉了,每次問題希望都是成長的機會,會有收穫,於是乎就到網上找了下自治事務(簡稱at)相關方面的說明 及用法,下午就到園子裡來mark下,供自己學習及各位園友參考;

1、自治事務使用情況

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

避免變異表: 即在觸發器中操作觸發此觸發器的表

在觸發器中使用ddl

寫資料庫:對資料庫有寫操作(insert、update、delete、create、alter、commit)的儲存過程或函式是無法簡單的用

sql來呼叫的,此時可以將其設為自治事務,從而避免ora-14552(無法在乙個查詢或dml中執行ddl、commit、rollback)、

ora-14551(無法在乙個查詢中執行dml操作)等錯誤。需要注意的是函式必須有返回值,但僅有in引數(不能有out或in/out引數)。

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

2、oracle 自製事務是指的儲存過程和函式可以自己處理內部事務不受外部事務的影響,用pragma

autonomous_transaction來宣告,要建立乙個自治事務,您必須在匿名塊的最高層或者儲存過程、函式、資料報或觸發的定義部分中,使用

pl/sql中的pragma autonomous_transaction語句。在這樣的模組或過程中執行的sql語句都是自治的。

create

orreplace

procedure autonomouse_insert is pragma autonomous_transaction;

begin
insert

into msg values('

autonomouse insert

');

commit;
end;
3、自治事務可以巢狀,巢狀深度等只受init.ora引數transactions(同時併發的事務數,預設為sessions的1.1倍)制 約。因為自治事務是與主事務(簡稱mt)相分離的,所以它不能檢測到被修改過的行的當前狀態。這就好像在主事務提交之前,它們一直處於單獨的會話裡,對自 治事務來說,它們是不可用的。然而,反過來情況就不同了:主事務能夠檢測到已經執行過的自治事務的結果。

4、如果at試圖訪問被mt控制的資源,可能有deadlock發生.package 不能被宣告為at,只有package所擁有的function和procedure 才能宣告為at。主

事務與自治事務是完全不同的事務,因此無法共享鎖等。結束乙個自治事務必須提交乙個commit、rollback或執行ddl,

否則會產生oracle錯誤ora-06519: active autonomous transaction detected and rolled back 。儲存點無法在自治事務中回滾到父事務中的乙個儲存點,只能在內部使用儲存點。

5、可能遇到的錯誤

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

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

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

oracle自主事務處理

假如乙個儲存過程中呼叫了另外乙個儲存過程,為了使兩個儲存過程之間的事務不會相互影響,就需要自主事務處理,下面舉例。create or replace procedure proc useradd1 ispragma autonomous transaction 用於標記子程式為自主事務處理 begi...

Oracle與SQL Server事務處理的比較

事務處理是所有大型資料庫產品的乙個關鍵疑問,各資料庫廠商都在這個方面花費了很大精力,不同的事務處理方式會導致資料庫效能和功能上的巨大差異。事務處理也是資料庫管理員與資料庫運用 程式開發人員必須深刻理解的乙個疑問,對這個疑問的疏忽可能會導致運用 程式邏輯不正確以及效率低下。下面我們針對oracle及s...

oracle後台記憶體事務處理

檢查點程序 觸發檢查點,記憶體硬碟的資料同步,寫系統改變號到控制檔案和資料檔案,並觸發dbwr程序寫快取資料到資料庫,同時也會觸 發lgwr程序,使日誌緩衝區的資料寫入日誌表,同時切換日誌組,對日誌進行歸檔。檢查點觸發時機 日誌組切換 例項關閉 手工發出 fast start mttr target...