//自治事务
//自治事务是"事务中的事务",它独立于父事务提交和回滚,利用自治事务,可以挂起当前事物,
//开始一个新事务,完成一些操作,然后提交或者回滚,所有这些事物都不影响当前执行事物的状态。
//它可用于:
// ·顶层匿名块
// ·本地(过程中的过程)、独立或打包的函数和过程
// ·对象类型的方法
// ·数据库触发器
//下面我们来看自治事物是如何工作的:
create table ta(msg varchar2(30));
create table tb(msg varchar2(30));
//我们建立两个过程,分别向两个表中添加数据:
//pragma autonomous_transaction用来标记自治事物,它独立于父事物:
create or replace procedure autonomous_insert
as
pragma autonomous_transaction;
begin
insert into ta values('autonomous insert');
commit;
end;
/
//普通事物:
create or replace procedure nonautonomous_insert
as
begin
insert into tb values('nonautonomous insert');
commit;
end;
/
//下面来看看非自治事物(也就是一般的事物)是如何工作的:
begin
insert into tb values('some data');
nonautonomous_insert;
rollback;
end;
SQL> select * from tb;
MSG
------------------------------
some data
nonautonomous insert
//从结果我们得知,在上面这个匿名过程中的rollback就像没有工作一样的。
//原因在于,nonautonomous_insert过程中的commit起了作用。
//它提交了调用这个过程之前的所有操作,我们知道oracle的执行过程是从逐条语句执行的,
//当碰到错误语句之后,就停止在这里,转而处理错误语句,一般是抛出异常。
//为了保持事物的原子性和一致性,出现异常的事物都要整体回滚;
//当顺序执行到某一步时,出现了commit语句,那么就会将此前的所有操作提交;
//
//如果想要让调用过程中的提交语句独立于主事物,那么必须借助自治事务
//自治事物的工作:
begin
insert into ta values('some date');
autonomous_insert;
rollback;
end;
SQL> select * from ta;
MSG
------------------------------
autonomous insert
//在这里,匿名过程中的rollback起作用了,它将主事物中的insert回滚了,
//但是在自治事务中提交的操作就不受这个rollback控制了,
//这正是我们所说的自治事务独立于主事物的特性.
//
//如果在非自治事物过程中提交了操作,那么在此commit之前的所有操作都会提交,不能回滚
//如果在自治事物中提交了操作,那么此操作将会影响到该自治事务的所有操作,而不会影响到主事物的操作。