面对开源的世界...
如果你追求阳光,就躲不开身后的身影。
posts - 115,comments - 86,trackbacks - 0

pragma autonomous_transaction

它是一种自治事务AT的标识,AT是由主事务MT调用但是独立于MT的事务,在AT被调用执行时,MT被挂起,在AT内部,一系列的DML可以被执行并且commit或rollback,注意由于AT的独立性,它的commit和rollback并不影响MT的执行效果。在AT执行结束后,主事务获得控制权,又可以继续执行了。


下面举例说明:

存储过程TEST1:

CREATE OR REPLACE PROCEDURE TEST1
(
  v_retvalue           out 
number 
)
AS
  v_ret 
number;
begin
  
insert into A values(11,'kk');
  
--调用子存储过程TEST2
  zxdbm_ismp.TEST2(1,v_ret);
  
commit;
  v_retvalue :
= 1;
exception 
when others then 
  
rollback;
  v_retvalue :
= 0;
end TEST1;


存储过程TEST2:

CREATE OR REPLACE PROCEDURE TEST2
(
   id 
number,
   v_retvalue out 
number
)
AS
   
--只有申明为自治事务,当TEST2有rollback,不会影响TEST1的insert数据,否则TEST1也会回滚,对于commit操作也是一样
   --AT是针对被调存储过程而言的 
   pragma autonomous_transaction;
   v_id 
number;
begin
  v_id :
= id;
  
rollback
  v_retvalue :
= 1;
exception 
when others then
  
rollback
  v_retvalue :
= 0;
end TEST2;

 

关于嵌套调用存储过程


存储过程TEST1:

CREATE OR REPLACE PROCEDURE TEST1
(
  v_retvalue           out 
number 
)
AS
  v_ret 
number;
begin
  
--调用子存储过程TEST2
  zxdbm_ismp.TEST2(1,v_ret);
  
insert into A values(11,'kk');
  
--TEST1中的rollback只针对TEST1中的A表insert操作,不会影响TEST2中的update操作,因为TEST2中已经commit了
  rollback;
  v_retvalue :
= 1;
exception 
when others then 
  
rollback;
  v_retvalue :
= 0;
end TEST1;


存储过程TEST2:

CREATE OR REPLACE PROCEDURE TEST2
(
   id 
number,
   v_retvalue out 
number
)
AS
   v_id 
number;
begin
  v_id :
= id;
  
update B set name = 'yyy' where id = v_id ;
  
commit;
  v_retvalue :
= 1;
exception 
when others then
  
rollback
  v_retvalue :
= 0;
end TEST2;


注:
一般建议在做大型应用的时候,存储过程不要嵌套层数过多,这样会导致父produce在调用完子produce后,接着执行父produce后续SQL语句,此时要是rollback了,则子produce则不会回滚,导致数据的不一致性。


对commit的理解

SQL语句在没有commit之前,其他的session并不能访问到这条数据,当在本次session结束时,数据库会自动commit数据。commit之前其他用户读到的还是旧数据,数据并没有真正插入到物理表。commit之后,LGWR进程会将redo缓冲中的内容写入redo log里边,但是不一定会真的写到数据文件。

DBWR进程,在下述条件下会将缓冲中的数据写入数据文件:
1.当服务进程扫描一定数目的缓冲以后,找不到干净的可用的缓冲,它会通知DBWn进程写入dirty缓冲中的数据.
2.DBWn进程会在检查点之前,周期地将缓冲区中的数据写入到文件,而检查点正是redo进程恢复时使用的起点。

posted on 2007-12-13 15:07 cheng 阅读(770) 评论(0)  编辑  收藏 所属分类: Oracle



标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-06 15:01 编辑过