1、独立事务独立事务独立事务独立事务曾创能目标目标目标目标通过本章学习,您将可以:了解独立事务的概念和用途了解独立事务的用法问题的提出问题的提出问题的提出问题的提出l问题想在执行当前一个由多个DML组成的transaction(事务)时,为每一步DML记录一些信息到跟踪表中,由于事务的原子性,这些跟踪信息的提交将决定于主事务的commit或rollback。如:begininsertsetlogupdatesetloginsert setlogcommit;end;l解决方案传统的解决方案之一:程序员不得不把这些跟踪信息记录到类似数组的结构中,然后在主事务结束后把它们存入跟踪表。什么是独立事务什么
2、是独立事务什么是独立事务什么是独立事务l独立事务 独立事务(AUTONOMOUS TRANSACTION,简称“AT”),又叫“自治事务”。AT 是由主事务(以下MT)调用但是独立于它的事务。l独立事务的特点 在AT被调用执行时,MT被挂起,在AT内部,一系列的DML可以被执行并且commit或rollback.由于AT的独立性,它的commit和rollback并不影响MT的执行效果。在AT执行结束后,主事务获得控制权,又可以继续执行了。OracleOracle中独立事务的用法中独立事务的用法中独立事务的用法中独立事务的用法条件编译PRAGMA AUTONOMOUS_TRANSACTION独
3、立事务的使用范围独立事务可以使用在以下的位置:独立事务可以使用在以下的位置:存储过程和函数;本地过程和函数;包;对象方法;匿名块的最顶层。使用独立事务的注意事项使用独立事务的注意事项使用独立事务的注意事项使用独立事务的注意事项注意事项在匿名PL/SQL块中,只有顶级的匿名PL/SQL块可以被设为AT 如果AT试图访问被MT控制的资源,可能有deadlock发生Package 不能被声明为AT,只有package所拥有的function和procedure 才能声明为AT AT程序必须以commit 或rollback结尾,否则会产生Oracle错误ORA-06519:active autono
4、mous transaction detected and rolled back THANK YOUSUCCESS2024/3/11 周一7可编辑独立事务举例独立事务举例独立事务举例独立事务举例 (1)(1)l记录结算日志(AT)PROCEDURE up_SetClearLog(i_TaskID IN VARCHAR2,i_LogInfo IN VARCHAR2,i_LogLevel IN VARCHAR2 DEFAULT INFO)ISPRAGMA AUTONOMOUS_TRANSACTION;l_Logtime t_clear_log.logtime%TYPE;l_LogSeqNoNUM
5、BER;l_Tradingdayt_clear_log.Tradingday%TYPE;BEGINl_Tradingday:=TO_CHAR(SYSDATE,YYYYMMDD);l_Logtime:=TO_CHAR(SYSDATE,HH24:MI:SS);SELECT seq_clear_log_id.NEXTVAL INTO l_LogSeqNo FROM DUAL;INSERT INTO t_clear_log(TRADINGDAY,id,logtime,taskid,loglevel,loginfo)VALUES(l_Tradingday,l_LogSeqNo,l_Logtime,i_T
6、askID,i_LogLevel,i_LogInfo);COMMIT;EXCEPTION WHEN OTHERS THEN NULL;END up_SetClearLog;独立事务举例独立事务举例独立事务举例独立事务举例 (2)(2)l结算 PROCEDURE up_settle(o_RetCode OUT INT,-返回结果码 o_RetMsg OUT VARCHAR2,-返回结果信息 i_TradingDay IN t_MemberEx.TradingDay%TYPE -交易日期,默认为当日 )IS -定义变量 l_location VARCHAR2(128);-当前位置 l_proc V
7、ARCHAR2(128);-存储过程名 l_level VARCHAR2(128);-错误级别BEGIN l_proc:=up_settle;l_level:=INFO;o_RetCode:=1;o_RetMsg :=操作失败;up_SetClearLog(l_proc,Begin,l_level);l_location:=客户持仓处理;up_DoClientPos(o_retCode,o_retMsg,i_tradingday);l_location:=会员出入金处理;up_DoMoneyIO(o_retCode,o_retMsg,i_tradingday);l_location:=会员资金
8、处理;Up_DoMemberFund(o_retCode,o_retMsg,i_tradingday);up_SetClearLog(l_proc,End,l_level);commit;o_RetCode:=0;o_RetMsg :=操作成功;RETURN;EXCEPTION WHEN OTHERS THEN o_RetCode:=1;o_RetMsg :=操作失败,出现错误!错误位置:|l_location|chr(10)|error:|sqlerrm;up_SetClearLog(l_proc,o_RetMsg,ERROR);END up_settle;思考思考思考思考对于其他不支持独立事务的数据库,例如IBM DB2、Sybase、MS SQL Server,如何支持类似oracle的独立事务呢?THANK YOUSUCCESS2024/3/11 周一13可编辑