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

在主自治事务中,我们插入一条记录,然后在自治事务中,查看表中行数,然后尝试插入三条记录,查看行数,最后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. Ubuntu 查看本机的ip

    打开终端中执行:ifconfig -a命令即可,如下图所示白色背景信息即是. 说明: enp0s3 表示第一块网卡, 其中 HWaddr 表示网卡的物理地址,可以看到目前这个网卡的物理地址(MAC地址 ...

  2. ngx_lua实现登录逻辑

    最近在公司做一个简单的portal,本来很简单的,只用ngx_lua就可以实现所有的业务逻辑,不需要upstream上游服务.但被要求接入公司内部的用户校验系统,说白了就是一个登录过程,只允许公司内部 ...

  3. Android之在Tab更新两个ListView,让一个listview有按下另个一个listview没有的效果

    直接上代码,不说了 UpdateListViewItem.zip

  4. Android之ListView和GridVIew加载图片

    清除缓存:ImageLoader 对象 . clearCache(); 使用: ImageLoader loader = new ImageLoader(ApplicationContext cont ...

  5. [Git] An efficient GIT workflow for mid/long term projects

    reference : http://fle.github.io/an-efficient-git-workflow-for-midlong-term-projects.html Our full-w ...

  6. 如何记录linux终端下的操作日志

    如何记录linux终端下的操作日志 在linux终端下,为方便检查操作中可能出现的错误,以及避免屏幕滚屏的限制,我们可以把操作日志记录下来.常用的工具有 screen,script,以及tee等,通过 ...

  7. DialogPlus

    项目地址:https://github.com/orhanobut/dialogplus  Demo地址:https://github.com/baiqiantao/DialogPlusTest co ...

  8. [Javascript] Function Expression Ex, Changing Declarations to Expressions

    Inside the Haunted Hickory House file, developers for the Forest of Function Expressions Theme Park ...

  9. 从头认识java-特辑-你不知道的main函数

    这一章节我们来讨论一下main函数. 对于这个函数大家都不陌生,并且都习以为常.可是当中有一些东西,还是值得我们去总结的. 1.普通的main package com.ray.test; public ...

  10. (LeetCode 160)Intersection of Two Linked Lists

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...