zoukankan      html  css  js  c++  java
  • oracle PRAGMA AUTONOMOUS_TRANSACTION

             数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败。在Oracle中,一个事务是从执行第一个数据管理语言(DML)语句开始,

    直到执行一个COMMIT语句,提交保存这个事务,或者执行一个ROLLBACK语句,放弃此次操作结束。事务的“要么全部完成,要么什么都没完成”的本性

    会使将错误信息记入数据库表中变得很困难,因为当事务失败重新运行时,用来编写日志条目的INSERT语句还未完成。针对这种困境,Oracle提供了一种

    便捷的方法,即自治事务。

             自治事务从当前事务开始,在其自身的语境中执行。它们能独立地被提交或重新运行,而不影响正在运行的事务。正因为这样,它们成了编写错误日志

    表格的理想形式。在事务中检测到错误时,您可以在错误日志表格中插入一行并提交它,然后在不丢失这次插入的情况下回滚主事务。因为自治事务是与主事务

    相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,

    反过来情况就不同了:主事务能够检测到已经执行过的自治事务的结果。

    2. 自治事物特点:

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

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

    2.3. 对数据库有写操作(INSERT、UPDATE、DELETE、CREATE、ALTER、COMMIT)的存储过程或函数是无法简单的用SQL来调用的,

       此时可以将其设为自治事务,从而避免ORA-14552(无法在一个查询或DML中执行DDL、COMMIT、ROLLBACK)、ORA-14551(无法在一个查询中执行DML操作)

       等错误。需要注意的是函数必须有返回值,但仅有IN参数(不能有OUT或IN/OUT参数)

    2.4. 在大型开发中,自治事务可以将代码更加模块化,失败或成功时不会影响调用者的其它操作,代价是调用者失去了对此模块的控制,并且模块内部无法引用调用者未

        提交的数据。

    2.5. 可能遇到的错误
        ORA-06519 – 检查到活动自治事务,回滚——退出自治事务时没有提交、回滚或DDL操作

        ORA-14450 – 试图访问正在使用的事务级临时表

        ORA-00060 – 等待资源时检查到死锁

    3.举例

       3.1.创建测试表

    -- Create table
    create table T_PRAGMA_EMP
    (
      id           NUMBER,
      pragma_value VARCHAR2(30)
    );

       3.2.创建自治事物存储过程

    create or replace procedure pro_pragma_program
    pragma autonomous_transaction; --自治事物
    begin
      insert into t_pragma_emp
      values(1,'autonomous');
      commit;
    end pro_pragma_program;

       3.3.匿名块调用

    begin
    insert into t_pragma_emp
    values(2,'plsqlblock');
    pro_pragma_program;
    rollback;
    end;

       3.4.显示结果

    --只插入过程中提交的数据,plblock中的数据被rollback了,显然过程中的事务是独立的,否则应该插入2条数据,因为procedure中有commit
    SQL> select * from t_pragma_emp t where t.id in (1,2); ID PRAGMA_VALUE ---------- ------------------------------ 1 autonomous

       3.5.注释过程中自治事物

    create or replace procedure pro_pragma_program
    is
    --pragma autonomous_transaction; --自治事物
    begin
      insert into t_pragma_emp
      values(1,'autonomous');
      commit;
    end pro_pragma_program;
    
    truncate table t_pragma_emp;
    
    begin
    insert into t_pragma_emp
    values(2,'plsqlblock');
    pro_pragma_program;
    rollback;
    end;
    
    --rollback没有什么可回滚的了,因为外面的事务被procedure中的commit提交了
    select * from t_pragma_emp t where t.id in (1,2);
  • 相关阅读:
    HDU 4348 To the moon(可持久化线段树)
    HDU 5875 Function 大连网络赛 线段树
    HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
    HDU 5876 大连网络赛 Sparse Graph
    HDU 5701 中位数计数 百度之星初赛
    CodeForces 708B Recover the String
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    ASP.NET生成验证码
    ASP.NET生成验证码
    ASP.NET生成验证码
  • 原文地址:https://www.cnblogs.com/jason3361/p/11591963.html
Copyright © 2011-2022 走看看