自治事务(autonomous transaction)允许你创建一个"事务中的事务",它能独立于其父事务提交或回滚。利用自治事务,可以挂起当前执行的事务,开始一个新事务,完成一些工作,然后提交或回滚,所有这些都不影响当前所执行事务的状态。自治事务提供了一种用PL/sql控制事务的新方法,可用于:
使用例子演示自治事务如何工作
--创建测试表用于保存信息 zx@ORCL>createtablet(msgvarchar2(25)); Tablecreated. --创建自治事务的存储过程 zx@ORCL>createorreplaceprocedureAutonomous_Insert 2as pragmaautonomous_transaction;---指示自治事务语句 4begin 5insertintotvalues('AutonomousInsert'); 6commit; 7end; 8/ Procedurecreated. --创建普通存储过程 zx@ORCL>createorreplaceprocedureNonAutonomous_Insert 2as 3begin 4insertintotvalues('NonAutonomousInsert'); 5commit; 6end; 7/ Procedurecreated.
zx@ORCL>begin 2insertintotvalues('AnonymousBlock'); 3NonAutonomous_Insert; 4rollback; 5end; 6/ PL/sqlproceduresuccessfullycompleted. zx@ORCL>select*fromt; MSG --------------------------------------------------------------------------- AnonymousBlock NonAutonomousInsert
可以观察到非自治事务的过程中的commit也把调用它的父事务也提交了,而父事务中的rollback没有起到作用。
zx@ORCL>deletefromt; 2rowsdeleted. zx@ORCL>commit; Commitcomplete. zx@ORCL>begin insertintotvalues('AnonymousBlock'); Autonomous_Insert; rollback; end; 6/ PL/sqlproceduresuccessfullycompleted. zx@ORCL>select*fromt; MSG --------------------------------------------------------------------------- AutonomousInsert
可以看到,自治事务过程中的commit只把它本身的事务提交了,而对于父事务的语句没有起到作用,而父事务中的rollback对自治事务中的语句也没有作用。