1、说明
自治事务是指被一个事务调用的事务,但是它独立于父事务提交(commit)或回滚(rollback)
2、语法
pragma autonomous_transaction;
3、自治事务一般被应用于
(1)顶级的PL/SQL匿名块(2)本地、对立或打包的函数或过程(包不能声明为自治事务,包中的函数和过程可以声明为自治事务)
(3)对象类型的方法
(4)触发器
4、案例
(1)顶级的PL/SQL匿名块
略
(2)存储过程
创建一个自治事务的存储过程
create or replace procedure auto_procedure
is
pragma autonomous_transaction; --声明是自治事务
begin
insert into student values(1,'NO01','张三',19,'中文系');
commit;
end;
创建一个非自治事务的存储过程
create or replace procedure noauto_procedure
is
begin
insert into student values(1,'NO01','张三',19,'中文系');
commit;
end;
调用自治事务存储过程并查看结果
begin
insert into student values(2,'NO02','李四',20,'数学系');
auto_procedure; --调用自治事务存储过程
rollback;
end;
select * from student; --查询结果
结果为:
说明在自治事务存储过程中的提交操作(commit)没有影响调用它的该匿名程序块(父事务)中insert的提交,因为匿名程序块中有回滚操作(rollback),所以表中直插入了自治事务存储过程中插入的一行数据,匿名程序块中插入的数据进行回滚了
调用非自治事务的存储过程并查看结果
begin
insert into student values(2,'NO02','李四',20,'数学系');
noauto_procedure; --调用非自治事务存储过程
rollback;
end;
select * from student; -查询结果
结果为:
说明该非自治事务存储过程中的提交操作将匿名程序块(父事务)中的insert也一并提交了,匿名程序块后面的rollback操作没有起到作用,所以表中插入了2条数据
(3)触发器
创建自治事务的触发器
create or replace trigger modify_stu
before insert on student
for each row
declare
pragma autonomous_transaction; --声明是自治事务
begin
insert into stu_log values(1,'insert',sysdate,:new.stu_name,:new.stu_age,:new.stu_major);
commit;
end;
向触发表中插入数据
begin
insert into student values(2,'no2','李四',20,'外语系');
rollback;
end;
查询student表是空的,因为主事务的insert回滚了,所以数据没有插入student表
查询stu_log表结果如下,虽然主事务的insert进行回滚了,但是触发器中的insert独立于主事务提交了,所以stu_log表中有数据
5、自治事务应用场景
(1)常用于记录日志和消息,无论对数据库的操作请求是否成功,只要访问数据库就都记录下来。如利用触发器限制某些对表的操作时,若记录日志,触发器抛出的异常会导致日志的回滚,此时可以使用自治事务。
(2)用于在触发器中操作触发此触发器的表
(3)对数据库有写操作(insert\update\delete\create\alter\commit)的存储过程或函数是无法简单用sql来调用的,此时可以将其设置为自治事务,但是函数必须又返回值,必须有且仅有in参数(不能有out或in/out参数)
(4)开发更模块化的代码:在大型开发中,自治事务可以使代码更模块化,成功或失败都不会影响调用者的其他操作,但是调用者会失去对该模块的控制,而且模块内部不能使用调用者未提交的数据