如下,新建两个存储过程:

在主自治事务中,我们插入一条记录,然后在自治事务中,查看表中行数,然后尝试插入三条记录,查看行数,最后rollback 查看行数,最后返回主事务,查看行数。

1、如下代码:

  --主事务
PROCEDURE p_test_at_and_mt IS
cnt NUMBER := -;
BEGIN
INSERT INTO msg VALUES ('father Record'); SELECT COUNT(*) INTO cnt FROM msg;
dbms_output.put_line('主事务插入一行之后行数:' || cnt);
p_test_at_and_mt_son;
dbms_output.put_line('运行子自治事务之后,主事务的行数:' || cnt);
--COMMIT;
END p_test_at_and_mt; --测试自治事务(子自治)
PROCEDURE p_test_at_and_mt_son IS
PRAGMA AUTONOMOUS_TRANSACTION;
cnt NUMBER := -;
BEGIN
SELECT COUNT(*) INTO cnt FROM msg;
dbms_output.put_line('插入三条记录之前子自治事务行数:' || cnt);
ROLLBACK; INSERT INTO msg VALUES ('son Record1');
INSERT INTO msg VALUES ('son Record2');
INSERT INTO msg VALUES ('son Record3'); SELECT COUNT(*) INTO cnt FROM msg;
dbms_output.put_line('插入三条记录之后子自治事务行数:' || cnt);
ROLLBACK; SELECT COUNT(*) INTO cnt FROM msg;
dbms_output.put_line('Rollback之后,子自治事务行数:' || cnt);
--COMMIT;
END p_test_at_and_mt_son;

测试主事务存储过程,结果如下:

主事务插入一行之后行数:1
插入三条记录之前子自治事务行数:0
插入三条记录之后子自治事务行数:3
Rollback之后,子自治事务行数:0
运行子自治事务之后,主事务的行数:1

可以看到,在运行从主事务,没有提交的事务,在子自治事务中是看不到的。但是在他主事务本身中没有提交也能看到插入了一条记录。

2、当我们将第二个存储过程,做点修改,假如下面着色部分两行,并且提交,我们运行主事务,看看有什么反映。

PROCEDURE p_test_at_and_mt_son IS
PRAGMA AUTONOMOUS_TRANSACTION;
cnt NUMBER := -;
BEGIN
SELECT COUNT(*) INTO cnt FROM msg;
dbms_output.put_line('插入三条记录之前子自治事务行数:' || cnt);
ROLLBACK; INSERT INTO msg VALUES ('son Record1');
INSERT INTO msg VALUES ('son Record2');
INSERT INTO msg VALUES ('son Record3'); SELECT COUNT(*) INTO cnt FROM msg;
dbms_output.put_line('插入三条记录之后子自治事务行数:' || cnt);
ROLLBACK; SELECT COUNT(*) INTO cnt FROM msg;
dbms_output.put_line('Rollback之后,子自治事务行数:' || cnt); INSERT INTO msg VALUES ('son Record4');
SELECT COUNT(*) INTO cnt FROM msg; --子事务插入最后一条
COMMIT;
END p_test_at_and_mt_son;

运行结果:

主事务插入一行之后行数:
插入三条记录之前子自治事务行数:
插入三条记录之后子自治事务行数:
Rollback之后,子自治事务行数:
运行子自治事务之后,主事务的行数:

竟然和第一个完全一样,可是我们在子自治事务中明明commit了啊,按照如果不加下面这一句的申明,那么我们可以肯定,看到的是 2(最后)

PRAGMA AUTONOMOUS_TRANSACTION;

看下,数据改变情况可以发现,我们的第一条,和子自治的最后commit的一条都插入了,进去。 自治,就是这个意思啦。
3、在做点修改,如下,直接插入三条记录,commit我们再次运行主事务,看结果:
  PROCEDURE p_test_at_and_mt_son IS
PRAGMA AUTONOMOUS_TRANSACTION;
cnt NUMBER := -;
BEGIN
SELECT COUNT(*) INTO cnt FROM msg;
dbms_output.put_line('插入三条记录之前子自治事务行数:' || cnt);
ROLLBACK; INSERT INTO msg VALUES ('son Record1');
INSERT INTO msg VALUES ('son Record2');
INSERT INTO msg VALUES ('son Record3'); SELECT COUNT(*) INTO cnt FROM msg;
dbms_output.put_line('插入三条记录之后子自治事务行数:' || cnt);
COMMIT;
END p_test_at_and_mt_son;

结果如下:

主事务插入一行之后行数:1
插入三条记录之前子自治事务行数:0
插入三条记录之后子自治事务行数:3
运行子自治事务之后,主事务的行数:1

相信到这里就知道了,主事务,看不到子事务的,commit rollback的操作,即:他们互相独立。

因为,我们在主事务中,没有写commit,你可以在运行过程中调试的时候,手动 按下rollback的按钮,你可以看到。后台把子事务的事务处理提交到了数据库。

总之:相互独立,不影响,不干扰,看到的数据也是。

分享共进步!

谢谢阅读!

 

Oracle自治事务实际用例的更多相关文章

  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自治事务(PRAGMA AUTONOMOUS_TRANSACTION)

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

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

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

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

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

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

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

  8. Oracle与SQL自治事务

    自治事务 自治事务是独立的事务操作,如果考虑到事务回滚,必须单独写成一个触发器来完成, 一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的 ...

  9. Oracle EBS 自治事务

    自治事务程序主要是自主性,那就是,独立于主要的事务.之所以独立,或者提交之后会影响其他事务处理,本质在于它本身符合编译指令的规则,也就是说它属于在编译阶段就执行的指令,而不是在运行阶段执行的. 当自治 ...

随机推荐

  1. Ladda 应用提交表单的时候显示loading载入中 包含不同位置,不同效果

    Ladda 应用提交表单的时候显示loading载入中 包含不同位置,不同效果 不同大小.位置,效果,进度条等 演示 XML/HTML Code <article class="exa ...

  2. Rsync服务介绍与配置

    Rsync 简要介绍 rsync 是一个用于增量文件传输的开源工具,不得不说,rsync简直是不同服务器间传输文件.同步文件的利器.与FTP相比,它具有非常简单的安装和配置方法.而且,rsync可以只 ...

  3. 【BZOJ】【1006】【HNOI2008】神奇的国度

    弦图最小染色/MCS算法 Orz PoPoQQQ  (UPD:ydc的写法好像更熟悉一些……(类似堆优化的Dij啊~ 先留个坑……明天再看一看……感觉好神奇>_<(完美消除序列之于弦图 就 ...

  4. 数据库实例: STOREBOOK > 表空间 > 编辑 表空间: UNDOTBS1

    ylbtech-Oracle:数据库实例: STOREBOOK  >  表空间  >  编辑 表空间: UNDOTBS1 表空间  >  编辑 表空间: UNDOTBS1 1. 一般 ...

  5. Informatica 常用组件Aggregator之二 分组依据端口

    聚合转换允许您为聚合定义组,而不是在所有的输入数据间执行聚合.例如,您可以查找按地区分组的总销量,而不是查找总的公司销量. 要为聚合表达式定义组,请选择聚合转换中的相应输入.输入/输出.输出和变量端口 ...

  6. poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重

    挺不错的题目,很锻炼代码能力和调试能力~ 题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1. 由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向 ...

  7. Java--解压缩zip包

    Test.java import java.io.IOException; public class Test { public static void main(String[] args) thr ...

  8. [Node.js]27. Level 5: URL Building & Doing the Request

    Let's create a page which calls the twitter search API and displays the last few results for Code Sc ...

  9. UE如何使用正则表达式

    1 基本概念 元字符: 元字符 说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符() \d 匹配数字 \b 匹配单词的开始或结束 \W 匹配任意不是字母 ...

  10. 数据库 之 E-R实体关系模型

    E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. 1.表示方法 E-R是描述现实世界概念结构模型的 ...