[置顶] Oracle中的自治事务(一)

♪  事务
       数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败。在Oracle中,一个事务是从执行第一个数据管理语言(DML)语句开始,直到执行一个COMMIT语句,提交保存这个事务;或者执行一个ROLLBACK语句,放弃此次操作结束。
♪   自治事务的出现
        1)事务的“要么全部完成,要么什么都没完成”的本性会使将错误信息记入数据库表中变得很困难,因为当事务失败重新运行时,用来编写日志条目的INSERT语句还未完成。
       2)在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事务)时,为每一步DML记录一些信息到跟踪表中,由于事务的原子性,这些跟踪信息的提交将决定于主事务的commit或rollback. 这样一来写程序的难度就增大了, 程序员不得不把这些跟踪信息记录到类似数组的结构中,然后在主事务结束后把它们存入跟踪表.哎,真是麻烦!
      3) 自治事务从当前事务开始,在其自身的语境中执行。它们能独立地被提交或重新运行,而不影响正在运行的事务。正因为这样,它们成了编写错误日志表格的理想形式。在事务中检测到错误时,您可以在错误日志表格中插入一行并提交它,然后在不丢失这次插入的情况下回滚主事务
♪   自治事务
        自治事务(以下简称AT) 是由主事务(以下MT)调用但是独立于它的事务。在AT被调用执行时,MT被挂起,在AT内部,一系列的DML可以被执行并且commit或rollback.   [置顶] Oracle中的自治事务(一)_第1张图片

由上图可知:  

     对于定义成自治事务的Procedure,实际上相当于一段独立运行的程序段,这段程序不依赖于主程序,也不干涉主程序 。DECLARE整个块都是属于父事务的,自治事务从离PRAGMA后的第一个BEGIN开始,只要此BEGIN块仍在作用域,则都属于自治事务。例如在DECLARE模块中声明一个写数据库的函数,则此函数虽然在自治事务所在存储过程执行,但其属于父事务;而自治事务中调用的任何函数和存储过程、激发的任何触发器等均为此自治事务的一部分。  

   ②  对于 数据库修改:父事务已提交的修改对自治事务可见,未提交的对自治事务不可见,自治事务的修改对父事务是否可见取决于隔离级别(Isolation Level)。

   ③   若使用缺省的READ COMMITTED隔离级别,则自治事务的修改对父事务可见;若改用SERIALIZABLE,则不可见。

特点:

第一,这段程序不依赖于原有Main程序,比如Main程序中有未提交的数据,那么在自治事务中是查找不到的。

第二,在自治事务中,commit或者rollback只会提交或回滚当前自治事务中的DML,不会影响到Main程序中的DML。

第三,结束一个自治事务必须提交一个COMMIT、ROLLBACK或执行DDL。

第四,自治事务可以嵌套,嵌套深度等只受INIT.ORA参数TRANSACTIONS(同时并发的事务数,缺省为SESSIONS的1.1倍)制约。

       第五,在你的一个事务(外层事务)中可以定义一个或者几个自治事务,自治事务可以独立commit,不对外层的事务产生影响。通常可以考虑将自治事务定义成一个过程,在外层的事务中调用;

       注意:由于AT的独立性,它的commit和rollback并不影响MT的执行效果。在AT执行结束后,主事务获得控制权,又可以继续执行了。 如何实现AT的定义呢?我们来看  一下它的语法。其实非常简单。   

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

1. 顶级的匿名PL/SQL块   

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

3. SQL Object Type的方法   

4. 触发器。


        由于篇幅原因,这里先简单给大家讲解一下自治事务的出现和原理,下一篇博客将通过实例来为大家见证自治事务的妙用;

你可能感兴趣的:(oracle,事务)