分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

这是一个非常实用的功能,特别用在记录错误日志同时要回滚主事务的时候,我们在实际开发中就是这么用的,感觉还是很方便的。转载一篇详细的介绍,感谢原作者。

在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题.,比如想在执行当前一个由多个DML组成的transaction(事务)时,为每一步DML记录一些信息到跟踪表中,由于事务的原子性,这些跟踪信息的提交将决定于主事务的commit或rollback. 这样一来写程序的难度就增大了, 程序员不得不把这些跟踪信息记录到类似数组的结构中,然后在主事务结束后把它们存入跟踪表.哎,真是麻烦!

有没有一个简单的方法解决类似问题呢?

ORACLE8i的AUTONOMOUS TRANSACTION(自治事务,以下AT)是一个很好的回答。

AT 是由主事务(以下MT)调用但是独立于它的事务。在AT被调用执行时,MT被挂起,在AT内部,一系列的DML可以被执行并且commit或rollback.

注意由于AT的独立性,它的commit和rollback并不影响MT的执行效果。在AT执行结束后,主事务获得控制权,又可以继续执行了。

如何实现AT的定义呢?我们来看一下它的语法。其实非常简单。

只需下列PL/SQL的声明部分加上PRAGMAAUTONOMOUS_TRANSACTION就可以了。

可以加自治事务的有:

1. 顶级的匿名PL/SQL块

2. Functions 或 Procedure(独立声明或声明在package中都可)

3. SQL Object Type的方法

4. 触发器。

比如:

在一个独立的procedure中声明AT

CREATE OR REPLACE PROCEDURE

Log_error(error_msg IN VARCHAR2(100))

IS

PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

Insert into Error_log values ( sysdate,error_msg);

COMMIT;

END;

下面我们来看一个例子,(win2000 advanced server + oracle8.1.6 , connect as scott)

建立一个表:

create table msg (msg varchar2(120));

首先,用普通的事务写个匿名PL/SQL块:

declare

cnt number := -1;  --} Global variables

procedure local is

begin

select count(*) into cnt from msg;

dbms_output.put_line('local: # of rows is '||cnt);

insert into msg values ('New Record');

commit;

end;

begin

delete from msg ;

commit;

insert into msg values ('Row 1');

local;

select count(*) into cnt from msg;

dbms_output.put_line('main: # of rows is '||cnt);

rollback;

local;

insert into msg values ('Row 2');

commit;

local;

select count(*) into cnt from msg;

dbms_output.put_line('main: # of rows is '||cnt);

end;

运行结果(注意打开serveroutput)

local: # of rows is 1  -> 子程序local中可以’看到’主匿名块中的uncommitted记录

main: # of rows is 2   -> 主匿名块可以’看到’2条记录(它们都是被local commit掉的)

local: # of rows is 2  -> 子程序local首先’看到’2条记录,然后又commit了第三条记录

local: # of rows is 4  -> 子程序local又’看到’了新增加的记录(它们都是被local commit掉的),然后又commit了第五条记录

main: # of rows is 5   -> 主匿名块最后’看到’了所有的记录.

从这个例子中,我们看到COMMIT和ROLLBACK的位置无论是在主匿名块中或者在子程序中,都会影响到整个当前事务.

现在用AT改写一下匿名块中的procedure local:

...

procedure local is

pragma AUTONOMOUS_TRANSACTION;

begin

...

重新运行(注意打开serveroutput)

local: # of rows is 0  -> 子程序local中无法可以’看到’主匿名块中的uncommitted记录 (因为它是独立的)

main: # of rows is 2   -> 主匿名块可以’看到’2条记录,但只有一条是被commited.

local: # of rows is 1  -> 子程序local中可以’看到’它前一次commit的记录,但是主匿名块中的记录已经被提前rollback了

local: # of rows is 3  -> 子程序local 中可以’看到’3条记录包括主匿名块commit的记录

main: # of rows is 4   ->主匿名块最后’看到’了所有的记录.

很明显,AT是独立的,在它执行时,MT被暂停了. AT的COMMIT,ROLLBACK并不影响MT的执行.

运用AT时,有一些注意事项,简单列举如下:

1.    在匿名PL/SQL块中,只有顶级的匿名PL/SQL块可以被设为AT

2.    如果AT试图访问被MT控制的资源,可能有deadlock发生.

3.    Package 不能被声明为AT,只有package所拥有的function和procedure 才能声明为AT

4.    AT程序必须以commit 或rollback结尾,否则会产生Oracle错误ORA-06519: active autonomous transaction detected and rolled back

在程序开发时,如果充分运用AUTONOMOUS TRANSACTION的特性,一定能取得事倍功半的效果.

如果文章对你用,请支持万事如意网址导航。

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

ORACLE中的自治事务相关推荐

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

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

  2. Oracle提供的自治事务记录日志的方法

    平时在存储过程或者触发器中,想对过程中出现的异常进行记录,但是又存在一个问题,就是异常的时候,之前的DML操作要回滚,那么对异常的记录的insert语句也要被回滚掉,怎么办?这个时候就可以用到Orac ...

  3. oracle触发器的自治事务

    1.插入数据,名次依次+1 今天有朋友提问说 ,oracle数据库怎么实现这个功能: 有一个排名表,插入一条数据排名为1的数据,之前表里数据1变成2,2,变成3类推.插入2,之前表里2变3,3变4类推 ...

  4. Oracle自治事务

    本文章来自http://hi.baidu.com/sqlercn/item/10f170c96fbbfad7964452b8 Oracle自治事务介绍 在正常情况下一但发出commit或是rollba ...

  5. Oracle之自治事务

    昨天处理项目中的一个业务需求要用到触发器实现,触发器中涉及到在inserting.deleting.updating之后来触发对表的操作,对于inserting.updating中的操作都可以正常实现 ...

  6. oracle 自治事物,自治事务 - 努力创造未来! - BlogJava

    自治事务前的事务管理(一般事务管理) 像 DML 这样的数据库扣作都是在事务的上下文环境中执行的.事务是一个或多个 SQL 语句的序列,执行一定的工作逻辑单元.事务.定义的特定会话可以由 commit ...

  7. Oracle 存储过程 中如何使用事务Transaction 自主事务 自治事务

    Oracle基础 存储过程和事务 一.事务和存储过程 在存储过程中如何使用事务.当需要在存储过程中同时执行多条添加.修改.删除SQL语句时,为了保证数据完整性,我们需要使用事务.使用方式和在PL-SQ ...

  8. PostgreSQL Oracle兼容性之 - plpgsql 自治事务(autonomous_transaction)补丁

    PostgreSQL Oracle兼容性之 - plpgsql 自治事务(autonomous_transaction)补丁 作者 digoal 日期 2016-11-04 标签 PostgreSQL ...

  9. oracle查大事务语句,查询Oracle 中死事务的语句

    查询Oracle 中死事务的语句 SQL> SELECT KTUXEUSN, KTUXESLT, KTUXESQN, /* Transaction ID */ 2  KTUXESTA Statu ...

最新文章

  1. CSDN 字体颜色表
  2. OVS搭建虚拟机全过程(四十五)
  3. Andriod监听支付宝收款实现个人支付宝支付接口!附安卓App
  4. 简述python函数调用过程_python函数定义和调用过程详解
  5. 全球六大国际域名解析量统计报告(6月25日)
  6. 操作系统饥饿现象_操作系统试题
  7. vue自动化部署linux,GitHub+Vue自动化构建部署
  8. 攻击者滥用 Citrix NetScaler 设备 0day,发动DDoS放大攻击
  9. android 抓包 2
  10. Gym 100703F Game of words 动态规划
  11. 小芋头君的知乎 Live 直播-前端开发者成长之路
  12. iocomp入门教程(绘制Plot)
  13. python 使用 config 文件
  14. 总纲篇:产品结构设计指导VII(本博客指引章节)
  15. mysql instr函数_MySQL 的instr函数
  16. 手机连接Fiddler后无法上网问题解决
  17. 2018-2019-2 20189221 《网络攻防技术》第八周作业
  18. 狐妖小红娘手游服务器维护,狐妖小红娘手游:游戏界面详细解析,狐妖小粉丝不要错过哦...
  19. 指针练习 - 使用指针找出函数中最大值和最小值
  20. 终于去看了麦兜响当当

热门文章

  1. 带你梳理Roach全量恢复的整体流程
  2. 从架构设计理念到集群部署,全面认识KubeEdge
  3. 拯救深度学习:标注数据不足下的深度学习方法
  4. 实践案例丨教你一键构建部署发布前端和Node.js服务
  5. 【华为云技术分享】网络场景AI模型训练效率实践
  6. 【华为云技术分享】《跟唐老师学习云网络》 - TUN/TAP网线
  7. 华为云OCR文字识别 免费在线体验!
  8. 如何获取目标软件的Docker镜像
  9. 电压放大倍数公式运放_资深工程师教你如何选择运放?
  10. Kotlin学习笔记 第二章 类与对象 第七节 数据类