Oracle中的自治事務(Autonomous Transaction)
Autonomous Transaction就是在Oracle允許建立一個事務中的事務,也就是說這種事務的提交或者是回滾不會影響到外層的事務的狀態,但是自治事務在應用的方面用到的不多,這裡僅僅列出最最常用的一種功能就是定製audit:
具例來說:
C:\Documents and Settings\Administrator>sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on 星期三 1月 9 22:32:17 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn hujinpei/passw0rd@irmdb
已連線。
我們首先建立一張事務表
----------------------------------
SQL> create table mytest
2 as
3 select * from sys.treeview;
表已建立。
建立一張記錄audit資訊的表
-----------------------------------------
SQL> create table audit_tab
2 (name varchar2(20) default user,
3 timestamp date default sysdate,
4 msg varchar2(500));
表已建立。
建立一個帶有自治事務的觸發器
-----------------------------------------------
SQL> create or replace trigger mytest_audit
2 before update on mytest
3 for each row
4 declare
5 pragma autonomous_transaction;
6 l_cnt number;
7 begin
8 select count(*) into l_cnt
9 from dual
10 where exists
11 ( select null from mytest where child=:new.child
12 start with parent = 'c'
13 connect by prior child=parent );
14 if (l_cnt=0)
15 then
16 insert into audit_tab (msg) values ('Attempt to update '|| :new.child);
17 commit;
18 raise_application_error (-20001,'Access Denied');
19 end if;
20 end;
21 /
觸發器已建立
raise_application_error會導致提示插入失敗,但是我所insert的row因為在自治事務中的commit,而不會得到回滾。
如果我們現在更新一個不屬於parent='c'的child,那麼就會報錯.
SQL> update mytest set child='b3' where child='b2';
update mytest set child='b3' where child='b2'
*
第 1 行出現錯誤:
ORA-20001: Access Denied
ORA-06512: 在 "HUJINPEI.MYTEST_AUDIT", line 15
ORA-04088: 觸發器 'HUJINPEI.MYTEST_AUDIT' 執行過程中出錯
可以在audit_tab中看到詳細的資訊
SQL> select * from audit_tab;
NAME TIMESTAMP
-------------------- --------------
MSG
--------------------------------------------------------------------------------
HUJINPEI 09-1月 -08
Attempt to update b3
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12361284/viewspace-132317/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AUTONOMOUS TRANSACTION(自治事務)的介紹(轉)
- Oracle 巢狀事務 VS 自治事務Oracle巢狀
- oracle中的processes,session,transaction引數詳解OracleSession
- oracle產生事務transaction幾種方式或方法Oracle
- oracle資料庫事務transaction 不同的鎖lock型別Oracle資料庫型別
- oracle事務隔離級別transaction isolation level初識Oracle
- oracle資料庫事務transaction鎖lock模式思考之一Oracle資料庫模式
- Spring中事務管理org.springframework.transactionSpringFramework
- PostgreSQL DBA(68) - 使用DBLink實現自治事務SQL
- DAPPER 事務 TRANSACTIONAPP
- indexedDB transaction 事務Index
- oracle事務transaction鎖lock一點兒小思考或總結Oracle
- oracle不同的事務transaction隔離級別isolation level進一步理解Oracle
- oracle 中的事務Oracle
- Django處理事務:transactionDjango
- oracle資料庫事務transaction隔離級別isolation level的選擇依據Oracle資料庫
- oracle資料庫事務不同事務隔離級別與v$transaction flag列思考Oracle資料庫
- 17_深入解析Oracle undo原理(1)_transactionOracle
- Spring @Transaction 註解是如何執行事務的?Spring
- Oracle Autonomous Linux:用於雲端計算的自我更新、自我修補的 Linux 發行版OracleLinux
- redis原始碼分析之事務Transaction(下)Redis原始碼
- BTC的Transaction
- Oracle Database 19c中的自動索引OracleDatabase索引
- Spring事務(Transaction)管理高階篇一棧式解決開發中遇到的事務問題Spring
- SAVIOR Securing Autonomous Vehicles with Robust Physical Invariants
- CRM User Status profile中Business Transaction欄位的用途
- mysql隱式提交事務transaction一點筆記MySql筆記
- 分散式事務 TCC-Transaction 原始碼解析 —— 事務儲存器分散式原始碼
- Laravel transaction : Laravel 的事務是不支援 eloquent 的? 要用 DB::的方式?為啥Laravel
- Solr Transaction Log(Tlog)的作用Solr
- Oracle 19c中的自動索引(DBMS_AUTO_INDEX)Oracle索引Index
- Oracle監聽器中的XDB、XPT和PLSExtProc服務Oracle
- SQLSERVER事務日誌已滿 the transaction log for database 'xx' is fullSQLServerDatabase
- 分散式事務 TCC-Transaction 原始碼分析 —— Dubbo 支援分散式原始碼
- PostgreSQL 原始碼解讀(225)- Transaction(子事務處理)SQL原始碼
- IDBObjectStore.transactionObject
- IDBDatabase.transaction()Database
- oracle的會話如何自殺?Oracle會話
- PostgreSQL 原始碼解讀(228)- Transaction(事務系統簡介)SQL原始碼