Oracle自治事务实际用例
如下,新建两个存储过程:
在主自治事务中,我们插入一条记录,然后在自治事务中,查看表中行数,然后尝试插入三条记录,查看行数,最后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自治事务实际用例的更多相关文章
- [转]了解oracle自治事务
http://blog.csdn.net/indexman/article/details/7799862 1.什么是Oracle自治事务 在官方文档中,是这样的定义的“Autonomous tran ...
- Oracle - 自治事务autonomous transaction
自治事务 - autonomous transaction 在Oracle数据库中,有时候我们会希望记录一个过程或者函数的运行日志,不管正常运行结束还是触发异常结束,都要记录. 正常结束的没有问题,但 ...
- Oracle自治事务
定 义: Autonomous transactions are independent transactions that can be called from within anot ...
- oracle自治事务(PRAGMA AUTONOMOUS_TRANSACTION)
这段时间遇到一个问题,程序里明明插入了一条记录,但在后边的一段Procedure中却查不到刚刚插入的记录,最后发现这个Procedure的定义中加入了PRAGMA AUTONOMOUS_TRANSAC ...
- 关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍
AUTONOMOUS TRANSACTION(自治事务)的介绍 在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事 ...
- (转)关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍
AUTONOMOUS TRANSACTION(自治事务)的介绍 在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事 ...
- oracle:触发器,自治事务 trigger
create or replace trigger TRI_FC83_INSERT before insert ON FC83 FOR EACH ROW declare PRAGMA AUTONOMO ...
- Oracle与SQL自治事务
自治事务 自治事务是独立的事务操作,如果考虑到事务回滚,必须单独写成一个触发器来完成, 一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的 ...
- Oracle EBS 自治事务
自治事务程序主要是自主性,那就是,独立于主要的事务.之所以独立,或者提交之后会影响其他事务处理,本质在于它本身符合编译指令的规则,也就是说它属于在编译阶段就执行的指令,而不是在运行阶段执行的. 当自治 ...
随机推荐
- 更改Mantis的logo
1 准备好自己的logo,例如准备的logo为zhaoxiyu.gif.zxy.gif 2 把上面的两个logo存放到C:/mantis-1.0.0a3/images 3 打开C:/mantis-1. ...
- [Android Pro] Android源码编译后,再重编译所需要做的清理工作
1.在源码目录的根目录下,make clean; 2.进到源码的\linux\kernel\目录下,执行make mrproper: 3.再退回到根目录,执行source build/envsetu ...
- memcpy实现
typedef unsigned int size_t; void * my_memcpy ( void *dest, const void *src, size_t num ) { void* re ...
- Guava 源码分析之 Beta, GwtCompatible, GwtIncompatible, Charset, HashCode
com.google.common.annotations.Beta /** * 表明一个公用API的未来版本是受不兼容变更或删除限制的 * 拥有这个注释标志的API不受任何兼容性保证 * */ @R ...
- 用java查询HBase中某表的一批数据
java代码如下: package db.query; import java.io.IOException; import org.apache.hadoop.conf.Configuration; ...
- Objective-C:除数为0的情况下异常的处理(检测、抛出、捕捉、处理)
// DivTest.h // 异常的处理 // // Created by ma c on 15/8/11. // Copyright (c) 2015年. All rights reserved. ...
- [每日一题] OCP1z0-047 :2013-08-04 INSERT --- WITH CHECK OPTION
这题是考:insertWITH CHECK OPTION的用法 insert into (<select clause> WITH CHECKOPTION) values (...) 这样 ...
- 任务栈 启动模式 Task Flag launchMode MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 解决IP地址冲突
1.重新启动路由器就可以. 要是网络上的每一个设备都被分配了动态IP地址,路由器重新启动.又一次分配IP地址给网络上的每一个设备后,这个问题就有望得到解决. 可是假设是在企业内就不可能随便的重新启动公 ...
- Android -- SDcard文件读取和保存
背景 一些东西可以 ...
3、在做点修改,如下,直接插入三条记录,commit我们再次运行主事务,看结果: