ORACLE自治事务

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)开发更模块化的代码:在大型开发中,自治事务可以使代码更模块化,成功或失败都不会影响调用者的其他操作,但是调用者会失去对该模块的控制,而且模块内部不能使用调用者未提交的数据

猜你喜欢

转载自blog.csdn.net/cc_0101/article/details/80736373