1 概述
1. '自治事务' 是什么?
(1) 自己管理自己(事务之间,各自为政,互不干扰)
(2) 自己的 commit、rollback 不会影响到其它事务,也不会被其它事务所影响
2. 常用场景
(1) 错误日志。记录错误日志的 commit,不会影响到业务数据
3. 语法
在语句声明部分 declare,加入下列语句即可
pragma autonomous_transaction;
1.1 事务图示
2 示例:错误日志
基础数据准备:
-- 创建学生信息表
create table scott.stu_info (
id number(10) constraint pk_sut_info_id primary key,
name varchar2(30),
sex varchar2(2)
);
-- 创建日志信息表
create table scott.log_info (
log_no number(10),
log_message varchar2(100),
create_user varchar2(50),
create_date date
);
package head:
create or replace package scott.pkg_test as
procedure p_main_test;
procedure p_log_info(v_log_message in varchar2);
end pkg_test;
/
package body:
create or replace package body scott.pkg_test as
-- *********************************************
-- 功能: 主程序。模拟报错并记录错误日志
-- *********************************************
procedure p_main_test as
v_sql_insert varchar2(300);
v_name stu_info.name%type;
v_sex stu_info.sex%type;
begin
-- 向测试表 stu_info 中插入数据
v_sql_insert := 'INSERT INTO stu_info(id, name, sex)
VALUES(:b1, :b2, :b3)';
-- 测试数据
v_name := '瑶瑶';
v_sex := '女';
execute immediate v_sql_insert
using 1, v_name, v_sex;
-- 【模拟报错: 违反主键约束】
execute immediate v_sql_insert
using 1, v_name, v_sex;
exception
when others THEN
p_log_info('违反主键约束');
end;
-- *********************************************
-- 功能: 记录日志
-- *********************************************
procedure p_log_info(v_log_message in varchar2) as
pragma autonomous_transaction; -- 声明自治事务,加 或 不加 的区别
v_log_sql_insert varchar2(300);
begin
v_log_sql_insert := 'INSERT INTO log_info(log_no, log_message, create_user, create_date)
VALUES(:b1, :b2, :b3, :b4)';
execute immediate v_log_sql_insert
using 1, v_log_message, 'admin', sysdate;
-- 提交自治事务,不影响主事务中未提交的记录。
commit;
end;
end pkg_test;
/
测试结果:自治事务 commit 不影响主事务(stu_info)