日期:2014-05-16 浏览次数:20525 次
自治事务(autonomous transaction)允许你创建一个“事务中的事务),它能独立于其父事务提交 通过例子来说明。 创建一个简单的表来保存消息:create table t ( msg varchar2(25) ); 接下来创建两个过程,每个过程只是将其名字插入到消息表中,然后提交。不过,其中一个过程是正 create or replace procedure Autonomous_Insert as 使用pragma AUTONOMOUS_TRANSACTION。这个指令告诉数据库:执行这个过程时要作为一 create or replace procedure NonAutonomous_Insert as 下面来观察PL/SQL 代码匿名块中非自治(nonautonomous)事务的行为: begin select * from t; 可以看到,匿名块执行的工作(INSERT)由NONAUTONOMOUNS_INSERT 过程提交。两个数据行都已提交, delete from t; commit; begin select * from t; 在此,只有自治事务中完成并已提交的工作会持久保留。匿名块中完成的INSERT 由第4 行的回滚语 如果在一个“正常”的过程中COMMIT,它不仅会持久保留自己的工作,也会使该会话中
或回滚。利用自治事务,可以挂起当前执行的事务,开始一个新事务,完成一些工作,然后提交或回滚,
所有这些都不影响当前执行事务的状态。自治事务提供了一种用PL/SQL 控制事务的新方法,可以用于:
顶层匿名块;
本地(过程中的过程)、独立或打包的函数和过程;
对象类型的方法;
数据库触发器。
常的过程,另一个编写为自治事务。我们将使用这些对象来显示在各种情况下哪些工作会在数据库中持久
保留(被提交)。
首先是AUTONOMOUS_INSERT 过程:
pragma autonomous_transaction;
begin
insert into t values ('Autonomous Insert');
commit;
end;
个新的自治事务来执行,而且独立于其父事务。
注意: pragma 是一个编译器指令,这是一种编辑器执行某种编译选项的方法。还有其他一些pragma。
以下是“正常”的NONAUTONOMOUS_INSERT 过程:
begin
insert into t values ('NonAutonomous Insert');
commit;
end;
insert into t values ('Anonymous Block');
NonAutonomous_Insert;
rollback;
end;
MSG
-------------------------
Anonymous Block
NonAutonomous Insert
所以ROLLBACK 命令没有什么可以回滚。把这个过程与自治事务过程的行为加以比较:
insert into t values ( 'Anonymous Block' );
Autonomous_Insert;
rollback;
end;
MSG
-------------------------
Autonomous Insert
句回滚。自治事务过程的COMMIT 对匿名块中开始的父事务没有影响。
未完成