oracle自治事务(PRAGMA AUTONOMOUS_TRANSACTION)
这段时间遇到一个问题,程序里明明插入了一条记录,但在后边的一段Procedure中却查不到刚刚插入的记录,最后发现这个Procedure的定义中加入了PRAGMA AUTONOMOUS_TRANSACTION。
PRAGMA AUTONOMOUS_TRANSACTION中文翻译过来叫“自治事务”(翻译的还算好理解),对于定义成自治事务的Procedure,实际上相当于一段独立运行的程序段,这段程序不依赖于主程序,也不干涉主程序

自治事务的特点
第一,这段程序不依赖于原有Main程序,比如Main程序中有未提交的数据,那么在自治事务中是查找不到的。
第二,在自治事务中,commit或者rollback只会提交或回滚当前自治事务中的DML,不会影响到Main程序中的DML。
Autonomous Transaction Demo 1
Without Pragma Autonomous Transaction
- CREATE TABLE t (
- test_value VARCHAR2(25));
- CREATE OR REPLACE PROCEDURE child_block IS
- BEGIN
- INSERT INTO t
- (test_value)
- VALUES
- ('Child block insert');
- COMMIT;
- END child_block;
- /
- CREATE OR REPLACE PROCEDURE parent_block IS
- BEGIN
- INSERT INTO t
- (test_value)
- VALUES
- ('Parent block insert');
- child_block;
- ROLLBACK;
- END parent_block;
- /
- -- run the parent procedure
- exec parent_block
- -- check the results
- SELECT * FROM t;
- Output:
- Parent block insert
- Child block insert
With Pragma Autonomous Transaction
- CREATE OR REPLACE PROCEDURE child_block IS
- PRAGMA AUTONOMOUS_TRANSACTION;
- BEGIN
- INSERT INTO t
- (test_value)
- VALUES
- ('Child block insert');
- COMMIT;
- END child_block;
- /
- CREATE OR REPLACE PROCEDURE parent_block IS
- BEGIN
- INSERT INTO t
- (test_value)
- VALUES
- ('Parent block insert');
- child_block;
- ROLLBACK;
- END parent_block;
- /
- -- empty the test table
- TRUNCATE TABLE t;
- -- run the parent procedure
- exec parent_block;
- -- check the results
- SELECT * FROM t;
- Output:
- Child block insert
Autonomous Transaction Demo 2
Without Pragma Autonomous Transaction
- DROP TABLE t;
- CREATE TABLE t (testcol NUMBER);
- CREATE OR REPLACE FUNCTION howmanyrows RETURN INTEGER IS
- i INTEGER;
- BEGIN
- SELECT COUNT(*)
- INTO i
- FROM t;
- RETURN i;
- END howmanyrows;
- /
- CREATE OR REPLACE PROCEDURE testproc IS
- a INTEGER;
- b INTEGER;
- c INTEGER;
- BEGIN
- SELECT COUNT(*)
- INTO a
- FROM t;
- INSERT INTO t VALUES (1);
- COMMIT;
- INSERT INTO t VALUES (2);
- INSERT INTO t VALUES (3);
- b := howmanyrows;
- INSERT INTO t VALUES (4);
- INSERT INTO t VALUES (5);
- INSERT INTO t VALUES (6);
- COMMIT;
- SELECT COUNT(*)
- INTO c
- FROM t;
- dbms_output.put_line(a);
- dbms_output.put_line(b);
- dbms_output.put_line(c);
- END testproc;
- /
- set serveroutput on
- exec testproc
- Output:
- 0
- 3
- 6
- Total execution time 2.782 sec.
With Pragma Autonomous Transaction
- CREATE OR REPLACE FUNCTION howmanyrows RETURN INTEGER IS
- i INTEGER;
- PRAGMA AUTONOMOUS_TRANSACTION;
- BEGIN
- SELECT COUNT(*)
- INTO i
- FROM t;
- RETURN i;
- END howmanyrows;
- /
- -- empty the test table
- TRUNCATE TABLE t;
- exec testproc;
- Output:
- 0
- 1
- 6
转载请注明出处:http://blog.csdn.net/pan_tian/article/details/7675800
oracle自治事务(PRAGMA AUTONOMOUS_TRANSACTION)的更多相关文章
- [转]了解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自治事务实际用例
如下,新建两个存储过程: 在主自治事务中,我们插入一条记录,然后在自治事务中,查看表中行数,然后尝试插入三条记录,查看行数,最后rollback 查看行数,最后返回主事务,查看行数. 1.如下代码: ...
- oracle函数自治事务解决不能增改删的语句操作
CREATE OR REPLACE FUNCTION SEQ3 (v_bname in VARCHAR2) return NUMBER is pragma autonomous_transaction ...
- ORACLE PRAGMA AUTONOMOUS_TRANSACTION 自治事务 单独提交某一段操作
个人使用示例: CREATE OR REPLACE PROCEDURE logs(p_remark VARCHAR2, p_log CLOB) AS 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 ...
随机推荐
- 常见Soc平台图形内存管理学习笔记
硬件编解码.硬件图像scale等过程,是在专有的硬件单元里进行,其使用的内存也是专有的内存,这种内存多是SoC中图形内存.如此方便与硬件加速图形渲染.图像显示.硬件图像加速处理等功能相交互. 上述过程 ...
- vue—data中变量和字符串拼接
#变量和字符串的拼接# 写项目中,遇到了这样的一个问题:怎样在一个div里面显示两个data中的数据?我的问题描述清楚了吗?... 看图吧: 这是用户最初的需求~ 这是用户后来的需求,嗯……就是 ...
- android app内部更新适配到8.0
app 内部跟新是app中必须要有的功能,在app出现改变时,app内部更新能以最快的速度将应用提升到最新版本. 步骤: 1.获取本地app的版本号 int versionCode = 0; try ...
- Virtualization
time sharing——>virtualization. OS需要low-level machinery mechanisms and high-level intelligence. 前者 ...
- ztree模糊筛选展开选中节点
树呢是一个最简单的树,并没有做一异步加载,也就是一个筛选,然后跳到第一个符合删选的数据下,并且所有符合的都会被展开和选中.其中ztreeAry是一个模拟的本地数组json.在test.json中,如果 ...
- 2018.5.24 lvm创建pool
在调试生产环境时遇到以下情况: 好奇心驱使下,发现是lvm的一个功能——lvm创建pool,就手动创建了相似的环境,操作截图如下: 主要命令: vgcreate -s 32M vg /dev/vdb1 ...
- XML注入(XXE)
XML所有元素都必须要有一个结束标志 大小写敏感 所有元素嵌套必须正确 所有的XML文档都必须要有一个根标志 XML包括XML声明,DTD文档类型定义(可选),文档元素 DTD即文档类型定义,用来为X ...
- angular1中ng-repeat效率优化方法:
1.当 ng-repeat 的数组被替换时, 它默认并不会重新利用已有的 Dom 元素,而是直接将其全部删除并重新生成新的数组 Dom 元素: 2.Dom 的频繁操作是非常不友好的, ng-repea ...
- MySQL Execution Plan--IN子查询包含超多值引发的查询异常
问题描述 版本:MySQL 5.7.24 SQL语句: SELECT wave_no, SUM(IF(picking_qty IS NULL, 0, picking_qty)) AS PICKED_Q ...
- edgedb 基本试用
环境准备 使用docker-compose 运行 docker-compose 文件 version: "3" services: db: image: edgedb/edgedb ...