Oracle 自治事务详解(pragma autonomous_transaction)

1 概述

1. '自治事务' 是什么?
   (1) 自己管理自己(事务之间,各自为政,互不干扰)
   (2) 自己的 commitrollback 不会影响到其它事务,也不会被其它事务所影响
   
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)
在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼丸丶粗面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值