这段时间遇到一个问题,程序里明明插入了一条记录,但在后边的一段Procedure中却查不到刚刚插入的记录,最后发现这个Procedure的定义中加入了PRAGMA AUTONOMOUS_TRANSACTION。

PRAGMA AUTONOMOUS_TRANSACTION中文翻译过来叫“自治事务”(翻译的还算好理解),对于定义成自治事务的Procedure,实际上相当于一段独立运行的程序段,这段程序不依赖于主程序,也不干涉主程序

自治事务的特点

第一,这段程序不依赖于原有Main程序,比如Main程序中有未提交的数据,那么在自治事务中是查找不到的。

第二,在自治事务中,commit或者rollback只会提交或回滚当前自治事务中的DML,不会影响到Main程序中的DML。

Autonomous Transaction Demo 1

Without Pragma Autonomous Transaction

  1.  
    CREATE TABLE t (
  2.  
    test_value VARCHAR2(25));
  3.  
     
  4.  
    CREATE OR REPLACE PROCEDURE child_block IS
  5.  
     
  6.  
    BEGIN
  7.  
    INSERT INTO t
  8.  
    (test_value)
  9.  
    VALUES
  10.  
    ('Child block insert');
  11.  
    COMMIT;
  12.  
    END child_block;
  13.  
    /
  14.  
     
  15.  
    CREATE OR REPLACE PROCEDURE parent_block IS
  16.  
     
  17.  
    BEGIN
  18.  
    INSERT INTO t
  19.  
    (test_value)
  20.  
    VALUES
  21.  
    ('Parent block insert');
  22.  
     
  23.  
    child_block;
  24.  
     
  25.  
    ROLLBACK;
  26.  
    END parent_block;
  27.  
    /
  28.  
     
  29.  
    -- run the parent procedure
  30.  
    exec parent_block
  31.  
     
  32.  
    -- check the results
  33.  
    SELECT * FROM t;
  1.  
    Output:
  2.  
    Parent block insert
  3.  
    Child block insert

With Pragma Autonomous Transaction

  1.  
    CREATE OR REPLACE PROCEDURE child_block IS
  2.  
     
  3.  
    PRAGMA AUTONOMOUS_TRANSACTION;
  4.  
     
  5.  
    BEGIN
  6.  
    INSERT INTO t
  7.  
    (test_value)
  8.  
    VALUES
  9.  
    ('Child block insert');
  10.  
     
  11.  
    COMMIT;
  12.  
    END child_block;
  13.  
    /
  14.  
     
  15.  
    CREATE OR REPLACE PROCEDURE parent_block IS
  16.  
     
  17.  
    BEGIN
  18.  
    INSERT INTO t
  19.  
    (test_value)
  20.  
    VALUES
  21.  
    ('Parent block insert');
  22.  
     
  23.  
    child_block;
  24.  
     
  25.  
    ROLLBACK;
  26.  
    END parent_block;
  27.  
    /
  28.  
    -- empty the test table
  29.  
    TRUNCATE TABLE t;
  30.  
     
  31.  
    -- run the parent procedure
  32.  
    exec parent_block;
  33.  
     
  34.  
    -- check the results
  35.  
    SELECT * FROM t;
  1.  
    Output:
  2.  
    Child block insert

Autonomous Transaction Demo 2

Without Pragma Autonomous Transaction

  1.  
    DROP TABLE t;
  2.  
     
  3.  
    CREATE TABLE t (testcol NUMBER);
  4.  
     
  5.  
    CREATE OR REPLACE FUNCTION howmanyrows RETURN INTEGER IS
  6.  
    i INTEGER;
  7.  
    BEGIN
  8.  
    SELECT COUNT(*)
  9.  
    INTO i
  10.  
    FROM t;
  11.  
     
  12.  
    RETURN i;
  13.  
    END howmanyrows;
  14.  
    /
  15.  
     
  16.  
    CREATE OR REPLACE PROCEDURE testproc IS
  17.  
    a INTEGER;
  18.  
    b INTEGER;
  19.  
    c INTEGER;
  20.  
    BEGIN
  21.  
    SELECT COUNT(*)
  22.  
    INTO a
  23.  
    FROM t;
  24.  
     
  25.  
    INSERT INTO t VALUES (1);
  26.  
    COMMIT;
  27.  
     
  28.  
    INSERT INTO t VALUES (2);
  29.  
    INSERT INTO t VALUES (3);
  30.  
     
  31.  
    b := howmanyrows;
  32.  
     
  33.  
    INSERT INTO t VALUES (4);
  34.  
    INSERT INTO t VALUES (5);
  35.  
    INSERT INTO t VALUES (6);
  36.  
    COMMIT;
  37.  
     
  38.  
    SELECT COUNT(*)
  39.  
    INTO c
  40.  
    FROM t;
  41.  
     
  42.  
    dbms_output.put_line(a);
  43.  
    dbms_output.put_line(b);
  44.  
    dbms_output.put_line(c);
  45.  
    END testproc;
  46.  
    /
  47.  
     
  48.  
    set serveroutput on
  49.  
     
  50.  
    exec testproc
  1.  
    Output:
  2.  
    0
  3.  
    3
  4.  
    6
  5.  
    Total execution time 2.782 sec.

With Pragma Autonomous Transaction

  1.  
    CREATE OR REPLACE FUNCTION howmanyrows RETURN INTEGER IS
  2.  
    i INTEGER;
  3.  
     
  4.  
    PRAGMA AUTONOMOUS_TRANSACTION;
  5.  
    BEGIN
  6.  
    SELECT COUNT(*)
  7.  
    INTO i
  8.  
    FROM t;
  9.  
     
  10.  
    RETURN i;
  11.  
    END howmanyrows;
  12.  
    /
  13.  
     
  14.  
    -- empty the test table
  15.  
    TRUNCATE TABLE t;
  16.  
     
  17.  
    exec testproc;
  1.  
    Output:
  2.  
    0
  3.  
    1
  4.  
    6

转载请注明出处:http://blog.csdn.net/pan_tian/article/details/7675800

oracle自治事务(PRAGMA AUTONOMOUS_TRANSACTION)的更多相关文章

  1. [转]了解oracle自治事务

    http://blog.csdn.net/indexman/article/details/7799862 1.什么是Oracle自治事务 在官方文档中,是这样的定义的“Autonomous tran ...

  2. Oracle - 自治事务autonomous transaction

    自治事务 - autonomous transaction 在Oracle数据库中,有时候我们会希望记录一个过程或者函数的运行日志,不管正常运行结束还是触发异常结束,都要记录. 正常结束的没有问题,但 ...

  3. Oracle自治事务

    定        义: Autonomous transactions are independent transactions that can be called from within anot ...

  4. Oracle自治事务实际用例

    如下,新建两个存储过程: 在主自治事务中,我们插入一条记录,然后在自治事务中,查看表中行数,然后尝试插入三条记录,查看行数,最后rollback 查看行数,最后返回主事务,查看行数. 1.如下代码: ...

  5. oracle函数自治事务解决不能增改删的语句操作

    CREATE OR REPLACE FUNCTION SEQ3 (v_bname in VARCHAR2) return NUMBER is pragma autonomous_transaction ...

  6. ORACLE PRAGMA AUTONOMOUS_TRANSACTION 自治事务 单独提交某一段操作

    个人使用示例: CREATE OR REPLACE PROCEDURE logs(p_remark VARCHAR2, p_log CLOB) AS PRAGMA AUTONOMOUS_TRANSAC ...

  7. 关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍

    AUTONOMOUS TRANSACTION(自治事务)的介绍 在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事 ...

  8. (转)关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍

    AUTONOMOUS TRANSACTION(自治事务)的介绍 在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事 ...

  9. oracle:触发器,自治事务 trigger

    create or replace trigger TRI_FC83_INSERT before insert ON FC83 FOR EACH ROW declare PRAGMA AUTONOMO ...

随机推荐

  1. excel 用VBA将所有单元格内容全部转换为文本

    Sub 将所有列全部转换为文本() t=timer 'Cells(Rows.Count, 1).End(xlUp).Row 获取第一列最后一个非空单元格的行号 s = Cells(, Columns. ...

  2. 关于QQ屏蔽某些文件上传一些有意思的事

    起因是因为某鱼事件... 资源倒是找了,可是因为TX的屏蔽文件上传.文件通过几次改名之后也没能上传成功(想想也没那么简单). 然后某神就写了上面那串代码实现上传.具体思想是:绕过文件摘要算法(hash ...

  3. 20155208徐子涵《网络对抗》Exp9 Web安全基础

    20155208徐子涵<网络对抗>Exp9 Web安全基础 实验要求 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验过程 最后一次了,没有选择尝试免考项目 ...

  4. spring AOP知识点总结以及日志的输出

    AOP的作用就是在基于OCP在不改变原有系统核心业务代码的基础上动态添加一些扩展功能.通常应用于日志的处理,事务处理,权限处理,缓存处理等等 首先,使用AOP需要添加的依赖有:spring-conte ...

  5. Lucene架构

    先整体上看一下Lucene的架构设计图(见下图),先看上层应用,首先是信息采集的过程,文件系统.数据库.万维网以及手工输入的文件都可以作为信息采集的对象,也是要搜索的文档的来源,采集万维网上的信息一般 ...

  6. PAT乙级考前总结(五)

    字符串处理 1003 我要通过! (20 分) “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否 ...

  7. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

  8. c# 中 利用 CookieContainer 对 Cookie 进行序列化和反序列化校验

    private void Form1_Load(object sender, EventArgs e) { var cookieStr = @".CNBlogsCookie=1BE76122 ...

  9. redis五种数据类型和常用命令及适用场景

    一.redis的5种数据类型: 1.基础理解: string 字符串(可以为整形.浮点型和字符串,统称为元素) list 列表(实现队列,元素不唯一,先入先出原则) set 集合(各不相同的元素) h ...

  10. ffmpeg-4.1.1-win64-dev在vs2017的搭建

    没得话讲,先在官网下载对应的源码,下载dev/文件夹下的源码和静态链接库  ,下载/shared文件夹下的动态链接库 官网地址:https://ffmpeg.zeranoe.com/builds/wi ...