在正常情况下一但发出commit或是rollback语句就会把这之前的所有修改提交或回滚,但是在oracle中提供了一种自治事务,在自治事务中发出的commit或rollback语句只会对自治事务内的更改起做用而不会对自治事务外的修改起做用。可以通过以下例子来看到这一结果:
首先建立一个表Create table Msg (Msg varchar(50)) 用于存储消息
建立自治事务下的插入过程
Create or Replace procedure AutoNomouse_Insert as
pragma autonomouse_transcation;
begin
insert into Msg values('AutoNomouse Insert');
commit;
end;
注:pragma autonomouse_transcation 表示在这个过程中启动自治事务
建立正常情况下的插入过程
Create or Replace Procedure NonAutoNomouse_Insert as
begin
insert into Msg Values('NonAutonomouse Insert');
commit;
end;
下面在一个匿名块中分别调用上面的两个过程
begin
insert into Msg Values('This Main Info');
NonAutoNomouse_Insert;
rollback;
end
select * from Msg
Msg
__________________________________________________
This Main Info
NonAutonomouse Insert
可以看到正个事务在过程NonAutoNomouse_Insert中被提交了Rollback并不起做用。
下面调用自治事务的过程如下:
begin
insert into Msg Values('This Main Info');
AutoNomouse_Insert;
rollback;
end
select * from Msg
MSG
--------------------------------------------------------------------------
AutoNomouse Insert
可以看到在自治事务中只提交了自治事务内的更改,所以Rollback回滚了自治事务外的更改。