自治事务 - autonomous transaction
在Oracle数据库中,有时候我们会希望记录一个过程或者函数的运行日志,不管正常运行结束还是触发异常结束,都要记录。
正常结束的没有问题,但是触发异常的情况下,一般的过程或者函数显然不能在插入运行日志之后直接Commit,因为触发异常后相关业务逻辑需要RollBack。
而自治事务就能够很好的避免了这样的问题,就是说自治事务是在某个会话中独立开启一个事务,在其中处理的操作不会影响到同一会话中其他事务未提交的内容。
下面开始举个例子说明一下:
1 --Run_Logs; //运行日志表,包含栏位dates, logs 2 3 --自治事务存储过程 4 CREATE OR REPLACE PROCEDURE Pro_Run_Logs(Error_Info In Varchar2) 5 Is PRAGMA AUTONOMOUS_TRANSACTION; 6 BEGIN 7 Insert Into Run_Logs(Dates, Logs) Values (Sysdate, Error_Info); 8 COMMIT; 9 END; 10 11 --一般业务逻辑存储过程 12 CREATE OR REPLACE PROCEDURE Pro_Test(v_oldcustname in varchar2,v_newcustname in varchar2) is 13 i number; 14 errorException exception; --申明异常 15 str_err varchar2(100); 16 user_err exception; 17 begin 18 --业务逻辑 19 20 Commit; 21 exception 22 When errorException Then 23 Pro_Run_Logs(str_err); 24 WHEN user_err THEN 25 raise_application_error(-20007, str_err); 26 RAISE; 27 end;