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

在主自治事务中,我们插入一条记录,然后在自治事务中,查看表中行数,然后尝试插入三条记录,查看行数,最后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. Windows下编译memcached-1.4.5(32bit和64bit)

    1.简介 Memcached 是一个高性能的分布式内存对象缓存系统.它通过将数据缓存在内存中来减少对数据库和文件系统的访问,减轻数据库及操作系统的负担,提高应用系统的速度. 目前已经很多系统应用了me ...

  2. spring Boot打可执行的jar包

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  3. version control system:git/hg/subversion/cvs/clearcase/vss。software configruation management。代码集成CI:Cruisecontrol/hudson/buildbot

    version control system: git/hg/subversion/cvs/clearcase/vss software configruation management: daily ...

  4. 在Mac OS X上配置Apache2

    转载:http://www.cnblogs.com/yuanyq/p/3435022.html#2821339 最近一段时间在开发面向移动设备的网页,而且是静态网页.所以很需要一个HTTP服务器,简单 ...

  5. Java并发学习之十五——使用读写锁同步数据訪问

    本文是学习网络上的文章时的总结.感谢大家无私的分享. 读写锁重要的是写锁的使用,仅仅用一个入口. 以下是读写锁使用的样例 package chapter2; import java.util.conc ...

  6. [12] 扇形体(Fan)图形的生成算法

    顶点数据的生成 bool YfBuildFunVertices ( Yreal radius, Yreal degree, Yreal height, Yuint slices, YeOriginPo ...

  7. 游戏:贪吃虫(GreedyMaggot)

    该游戏类似于贪吃蛇,但可以在二维平面上以任意方向前进.当吃到食物手,食物会从虫头向虫尾移动,移到虫尾后,贪吃虫长度会增加.本来给它取名为贪吃蛆的,并且工程的英文名Maggot就是蛆的意思,后来想想有点 ...

  8. OpenProcess、GetExitCodeProcess、TerminateProcess

    //声明: {返回进程的句柄} OpenProcess(   dwDesiredAccess: DWORD;  {訪问选项}   bInheritHandle: BOOL;    {是否能继承; Tr ...

  9. Qt5 for Android: incompatible ABI

      I recently installed Qt5 and works like a charm for API 17 and armeabi-v7a.But I added second AVD ...

  10. 内有干货!2个人3个月怎样从零完毕一款社区App《林卡》

    嘿,大家好.我是不灭的小灯灯,我赌5毛你没听说过我的名字... 好啦.这篇不是鸡汤,是经验吐槽.干货分享! 所以乱七八糟的就不多说了.直接切入正题. 先说下自己的情况背景,眼下尚未毕业.非计算机专业, ...