技术开发 频道

Oracle的自治事务



【IT168 技术文档】

它是一种自治事务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也会回滚
   --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;

0
相关文章