昨天处理项目中的一个业务需求要用到触发器实现,触发器中涉及到在inserting、deleting、updating之后来触发对表的操作,对于inserting、updating中的操作都可以正常实现,就是deleting的时候,要求更新其他表,更新的值是对触发器表自身的查询操作,本人在有限的水平范围之内试过N中方式来达到需求,最后无果,无奈之下只有找经理帮忙看看问题,最终问题被解决了,果然是用到了自己不太熟悉的oracle自治事务,而且这个自治事务因为是独立的事务操作,考虑到事务回滚,必须单独写成一个触发器来完成,最后问题被老大解决掉了,每次问题希望都是成长的机会,会有收获,于是乎就到网上找了下自治事务(简称AT)相关方面的说明及用法,下午就到园子里来mark下,供自己学习及各位园友参考;

1、自治事务使用情况

无法回滚的审计 : 一般情况下利用触发器禁止某些对表的更新等操作时,若记录日志,则触发器最后抛出异常时会造成日志回滚。利用自治事务可防止此点。
避免变异表: 即在触发器中操作触发此触发器的表
在触发器中使用ddl 写数据库:对数据库有写操作(insert、update、delete、create、alter、commit)的存储过程或函数是无法简单的用sql来调用的,此时可以将其设为自治事务,从而避免ora-14552(无法在一个查询或dml中执行ddl、commit、rollback)、ora-14551(无法在一个查询中执行dml操作)等错误。需要注意的是函数必须有返回值,但仅有in参数(不能有out或in/out参数)。
开发更模块化的代码: 在大型开发中,自治事务可以将代码更加模块化,失败或成功时不会影响调用者的其它操作,代价是调用者失去了对此模块的控制,并且模块内部无法引用调用者未提交的数据。

2、Oracle 自制事务是指的存储过程和函数可以自己处理内部事务不受外部事务的影响,用pragma autonomous_transaction来声明,要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL语句都是自治的。

View Code

create or replace procedure AutoNomouse_Insert is PRAGMA AUTONOMOUS_TRANSACTION; 
begin 
insert into Msg values('AutoNomouse Insert');   
commit;  
 end;

3、自治事务可以嵌套,嵌套深度等只受init.ora参数transactions(同时并发的事务数,缺省为sessions的1.1倍)制约。因为自治事务是与主事务(简称MT)相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,反过来情况就不同了:主事务能够检测到已经执行过的自治事务的结果。

4、如果AT试图访问被MT控制的资源,可能有deadlock发生.Package 不能被声明为AT,只有package所拥有的function和procedure 才能声明为AT。主事务与自治事务是完全不同的事务,因此无法共享锁等。结束一个自治事务必须提交一个commit、rollback或执行ddl,否则会产生Oracle错误ORA-06519: active autonomous transaction detected and rolled back 。保存点无法在自治事务中回滚到父事务中的一个保存点,只能在内部使用保存点。

5、可能遇到的错误
ora-06519 – 检查到活动自治事务,回滚——退出自治事务时没有提交、回滚或ddl操作
ora-14450 – 试图访问正在使用的事务级临时表
ora-00060 – 等待资源时检查到死锁

转载于:https://www.cnblogs.com/Ronger/archive/2012/02/15/2352527.html

Oracle之自治事务相关推荐

  1. oracle:触发器,自治事务,instead of trigger,trigger

    触发器的格式: CREATE [OR REPLACE ] TRIGGER trigger_name {BEFORE| AFTER} {UPDATE| INSERT| DELETE|SELECT} ON ...

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

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

  3. Oracle自治事务

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

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

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

  5. ORACLE中的自治事务

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 这是一个 ...

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

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

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

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

  8. oracle触发器的自治事务

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

  9. oracle自治事务的写法_Oracle的自治事务

    自治事务(autonomous transaction)允许你创建一个"事务中的事务",它能独立于其父事务提交或回滚.利用自治事务,可以挂起当前执行的事务,开始一个新事务,完成一些 ...

最新文章

  1. Python找出序列中出现最多的元素
  2. Gamma阶段项目展示
  3. python整数类型-python基础数据类型一(整数类型和布尔值)
  4. 《spring揭秘》读书笔记三
  5. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第11章-大系统的分散控制
  6. 在滴滴和头条干了 2 年后端开发,太真实…
  7. 我的地盘我做主——你必须遵守的Python编码规范
  8. mongodb幽灵操作的解决方案
  9. 玩Docker只要浏览器就够了,PWD是个神奇的网站
  10. android 万能倒计时,时分秒倒计时
  11. NYOJ-单调递增最长子序列(dp)
  12. 计算机二级的注册证件号码,如何在Excel中输入以0开头的证件号码
  13. 五种常用源代码开源协议
  14. Qt 编译器添加 vs编译器
  15. php元万亿单位转换,单位换算
  16. 相机光学传递函数MTF
  17. 在电脑中怎样画思维导图
  18. aspose给word添加水印
  19. 函数和绝对值函数可导,可积,连续,极限间的关系
  20. C1认证学习十(Ipv6)

热门文章

  1. 【hdu4010】 Query on The Trees
  2. UVa 1153 Keep the Customer Satisfied 【贪心 优先队列】
  3. uestc 851 方老师与素数
  4. MinGW 使用 msvcr90.dll
  5. Web.config的配置
  6. 解读边缘计算在7大领域的研究趋势和最新进展
  7. 现在的00后都这么牛X的吗?
  8. 一文领略 HTTP 的前世今生
  9. 都9012年了,还有人说IntelliJ IDEA不好用?那是因为没掌握这些技巧。
  10. vue-ls vue 本地储存示例