【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;