oracle 自治事物

//自治事务   

//自治事务是"事务中的事务",它独立于父事务提交和回滚,利用自治事务,可以挂起当前事物,   

//开始一个新事务,完成一些操作,然后提交或者回滚,所有这些事物都不影响当前执行事物的状态。   

//它可用于:   

//  ·顶层匿名块   

//  ·本地(过程中的过程)、独立或打包的函数和过程   

//  ·对象类型的方法   

//  ·数据库触发器   

//下面我们来看自治事物是如何工作的:   

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之前的所有操作都会提交,不能回滚   

//如果在自治事物中提交了操作,那么此操作将会影响到该自治事务的所有操作,而不会影响到主事物的操作。  

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值