自治事务程序主要是自主性,那就是,独立于主要的事务。之所以独立,或者提交之后会影响其他事务处理,本质在于它本身符合编译指令的规则,也就是说它属于在编译阶段就执行的指令,而不是在运行阶段执行的。

当自治事务行使时,主要的事务处理是暂缓状态的。自治事务完全独立于主要的事务处理。他们不分享锁、资源或者是提交的独立性。自治事务处理不会影响主要的事务处理。

当自治事务提交时,自治事务的改变会对其他的事物处理显而易见的。只有当它的隔离水平是READ COMMITTED(默认值)时,当它重新运行时对主要的事务处理而言是可见的。

注意以下几点:

编译指令在编译的时候就完成了,而不是在运行的时候完成的。他们经由编译器传递消息;

编译指示不能作用在整个包上,但是你可以作用在包里的每个子程序;

编译指示不能作用整个object类型上,但是可以作用在每种SQL object 类型上;

不像普通的触发器,一个自动触发器可以包含事务控制描述,像是提交和回滚,可以通过 EXECUTE IMMEDIATE 进行DDL操作,像是 create 或者 drop。

在主要的事务中,会滚到一个定位在自治事务子程序之前的保留点,是不会回滚掉自治事务。记住,自治事务是完全独立于主要事务的;

如果一个自治事务尝试使用被主要事务处理占用的资源(只能当自治退出后才能重启),那么会造成死锁。数据库会抛出在自治事务的异常。如果异常无法处理那么会进行回滚;

如果你在没有提交或者回滚是尝试退出一个活跃状态的自治事务,数据库会抛出异常。如果异常无法处理或者因为其他无法预料的异常事务处理结束,那么该事物会回滚;

当你的自治事务是开启状态是你不能对你的自治规则执行管线 row声明。在执行管线 PIPE ROW声明钱你必须关掉自治事务。在执行 PIPE ROW 生命史提交或者回滚自治事务是普遍实现的。

1. 自治事务方法

  1. CREATE OR REPLACE PACKAGE emp_actions AS -- package specification
  2. FUNCTION raise_salary (emp_id NUMBER, sal_raise NUMBER)
  3. RETURN NUMBER;
  4. END emp_actions;
  5. /
  6. CREATE OR REPLACE PACKAGE BODY emp_actions AS -- package body
  7. -- code for function raise_salary
  8. FUNCTION raise_salary (emp_id NUMBER, sal_raise NUMBER)
  9. RETURN NUMBER IS
  10. PRAGMA AUTONOMOUS_TRANSACTION;
  11. new_sal NUMBER(8,2);
  12. BEGIN
  13. UPDATE employees SET salary =
  14. salary + sal_raise WHERE employee_id = emp_id;
  15. COMMIT;
  16. SELECT salary INTO new_sal FROM employees
  17. WHERE employee_id = emp_id;
  18. RETURN new_sal;
  19. END raise_salary;
  20. END emp_actions;

  

  1. CREATE TABLE debug_output (msg VARCHAR2(200));
  2.  
  3. -- create the package spec
  4. CREATE PACKAGE debugging AS
  5. FUNCTION log_msg (msg VARCHAR2) RETURN VARCHAR2;
  6. PRAGMA RESTRICT_REFERENCES(log_msg, WNDS, RNDS);
  7. END debugging;
  8. /
  9. -- create the package body
  10. CREATE PACKAGE BODY debugging AS
  11. FUNCTION log_msg (msg VARCHAR2) RETURN VARCHAR2 IS
  12. PRAGMA AUTONOMOUS_TRANSACTION;
  13. BEGIN
  14. -- the following insert does not violate the constraint
  15. -- WNDS because this is an autonomous routine
  16. INSERT INTO debug_output VALUES (msg);
  17. COMMIT;
  18. RETURN msg;
  19. END;
  20. END debugging;

  

2. 自治事务过程

  1. CREATE PROCEDURE lower_salary (emp_id NUMBER, amount NUMBER) AS
  2. PRAGMA AUTONOMOUS_TRANSACTION;
  3. BEGIN
  4. UPDATE employees SET salary =
  5. salary - amount WHERE employee_id = emp_id;
  6. COMMIT;
  7. END lower_salary;

  

  1. DECLARE
  2. my_emp_id NUMBER(6);
  3. my_last_name VARCHAR2(25);
  4. my_count NUMBER;
  5. BEGIN
  6. my_emp_id := 120;
  7. SELECT debugging.log_msg(last_name)
  8. INTO my_last_name FROM employees
  9. WHERE employee_id = my_emp_id;
  10. -- even if you roll back in this scope, the insert into 'debug_output' remains
  11. -- committed because it is part of an autonomous transaction
  12. ROLLBACK;
  13. END;

  

3. 自治事务块

4. 自治事务触发器

  1. CREATE TABLE emp_audit ( emp_audit_id NUMBER(6), up_date DATE,
  2. new_sal NUMBER(8,2), old_sal NUMBER(8,2) );
  3.  
  4. CREATE OR REPLACE TRIGGER audit_sal
  5. AFTER UPDATE OF salary ON employees FOR EACH ROW
  6. DECLARE
  7. PRAGMA AUTONOMOUS_TRANSACTION;
  8. BEGIN
  9. -- bind variables are used here for values
  10. INSERT INTO emp_audit VALUES( :old.employee_id, SYSDATE,
  11. :new.salary, :old.salary );
  12. COMMIT;
  13. END;

  

下面拿一个例外举例说明一下事务处理的用途。

例外声明关联着用户定义的例外名称和 oracle数据库的错误编码。你可以拦截任何oracle数据量的错误数字然后写一个例外处理他,而不是使用others处理。

其中的错误数据是指错误数字任何有效的oracle 数据库错误数字,这些同方法 SQLCODE 返回的错误数字相同(通常是负数)。例外名称是指例外名称是指定义这个声明是一个编译指示。编译指示在编译是处理,而不是在运行时间时处理。这一点和自治事务运行一样。

下面的例子展示了你可以执行一个DML操作返回的数字,而不是一些操作碰到错误的时候停下来。这个例子中例外是 ORA-24381 。

在执行是所有的抛出的意外被保存在游标attribute中 %BULK_EXCEPTIONS 。每一个记录有两块。

%BULK_EXCEPTIONS(i).ERROR_INDEX 存储的是在异常被抛出是后的 FORALL声明中的循环;

%BULK_EXCEPTIONS(i).ERROR_CODE 中存储的是 ORACLE 数据库相关的错误编码;

例外的个数被保存在%BULK_EXCEPTIONS.COUNT ,他计数从1开始。

个体的错误信息或者任何可替代的参数,不被保存。但是错误信息可使用 ERROR_CODE 看到。

在如下例子里,plsql抛出了一个定义好的异常,因为更新数据太大对于将数据插入到job_id列。在FORALL声明后 SQL%BULK_EXCEPTIONS.COUNT 返回2. SQL%BULK_EXCEPTIONS 内容是 (7,12899) and (13,12899)。

  1. DECLARE
  2. deadlock_detected EXCEPTION;
  3. PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
  4. BEGIN
  5. NULL; -- Some operation that causes an ORA-00060 error
  6. EXCEPTION
  7. WHEN deadlock_detected THEN
  8. NULL; -- handle the error
  9. END;
  10. /
  11. -- Temporary table for this example:
  12. CREATE TABLE emp_temp AS SELECT * FROM employees;
  13.  
  14. DECLARE
  15. TYPE empid_tab IS TABLE OF employees.employee_id%TYPE;
  16. emp_sr empid_tab;
  17.  
  18. -- Exception handler for ORA-24381:
  19. errors NUMBER;
  20. dml_errors EXCEPTION;
  21. PRAGMA EXCEPTION_INIT(dml_errors, -24381);
  22. BEGIN
  23. SELECT employee_id
  24. BULK COLLECT INTO emp_sr FROM emp_temp
  25. WHERE hire_date < '30-DEC-94';
  26.  
  27. -- Add '_SR' to job_id of most senior employees:
  28. FORALL i IN emp_sr.FIRST..emp_sr.LAST SAVE EXCEPTIONS
  29. UPDATE emp_temp SET job_id = job_id || '_SR'
  30. WHERE emp_sr(i) = emp_temp.employee_id;
  31. -- If errors occurred during FORALL SAVE EXCEPTIONS,
  32. -- a single exception is raised when the statement completes.
  33.  
  34. EXCEPTION
  35. -- Figure out what failed and why
  36. WHEN dml_errors THEN
  37. errors := SQL%BULK_EXCEPTIONS.COUNT;
  38. DBMS_OUTPUT.PUT_LINE
  39. ('Number of statements that failed: ' || errors);
  40. FOR i IN 1..errors LOOP
  41. DBMS_OUTPUT.PUT_LINE('Error #' || i || ' occurred during '||
  42. 'iteration #' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);
  43. DBMS_OUTPUT.PUT_LINE('Error message is ' ||
  44. SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
  45. END LOOP;
  46. END;
  47. /
  48. DROP TABLE emp_temp;
  49.  
  50. The output from the example is similar to:
  51.  
  52. Number of statements that failed: 2
  53. Error #1 occurred during iteration #7
  54. Error message is ORA-12899: value too large for column
  55. Error #2 occurred during iteration #13
  56. Error message is ORA-12899: value too large for column

  

Oracle EBS 自治事务的更多相关文章

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

    create or replace trigger TRI_FC83_INSERT before insert ON FC83 FOR EACH ROW declare PRAGMA AUTONOMO ...

  2. oracle函数自治事务解决不能增改删的语句操作

    CREATE OR REPLACE FUNCTION SEQ3 (v_bname in VARCHAR2) return NUMBER is pragma autonomous_transaction ...

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

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

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

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

  5. [转]了解oracle自治事务

    http://blog.csdn.net/indexman/article/details/7799862 1.什么是Oracle自治事务 在官方文档中,是这样的定义的“Autonomous tran ...

  6. Oracle与SQL自治事务

    自治事务 自治事务是独立的事务操作,如果考虑到事务回滚,必须单独写成一个触发器来完成, 一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的 ...

  7. Oracle - 自治事务autonomous transaction

    自治事务 - autonomous transaction 在Oracle数据库中,有时候我们会希望记录一个过程或者函数的运行日志,不管正常运行结束还是触发异常结束,都要记录. 正常结束的没有问题,但 ...

  8. ORACLE PRAGMA AUTONOMOUS_TRANSACTION 自治事务 单独提交某一段操作

    个人使用示例: CREATE OR REPLACE PROCEDURE logs(p_remark VARCHAR2, p_log CLOB) AS PRAGMA AUTONOMOUS_TRANSAC ...

  9. Oracle 通过触发器 来创建 同步临时表 及处理 通过 自治事务 来解决 查询 基表的问题

    // 触发器 create or replace trigger tr_sync_BD_MARBASCLASS after INSERT or UPDATE on BD_MARBASCLASS for ...

随机推荐

  1. iis7 bug解决

    只需重新注册下AspNet就可以了,具体步骤如下 1 打开运行,输入cmd进入到命令提示符窗口. 2 进入到C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727 ...

  2. Python基础之白话说函数

    转自白月黑羽Python3教程之函数:http://www.python3.vip/doc/tutorial/python/0005/ 什么是函数 人类语言里面,我们不仅会给人和物起名字, 比如 小张 ...

  3. xshell 登陆堡垒机实现自动跳转

    1, 正常使用用户密码登录堡垒机并保存登陆配置 2, 配置登陆脚本 添加第一个: expect 为空send :ssh root@ip 添加第二个: expect root@ip's password ...

  4. QT QPushButton

    #include<QApplication> #include<QWidget> #include<QPushButton> #include<QMenu&g ...

  5. Java Collection 学习

    定义:Java 作为面向对象语言,对象的操作必比然是重中之重.要操作一个对象容易,如果需要存储多个对象,则需要一个容器,存储多个对象可以使用数组,但是数组的长度是不可变的.所以有了集合的概念.Coll ...

  6. zoj Beautiful Number(打表)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2829 题目描述: Mike is very lucky, as ...

  7. vue-cli中配置屏幕自适应(px2rem)

    在vue-cli中配置屏幕自适应的方法 首先,我们需要安装flexible库. npm i lib-flexible --save 在index.html文件当中配置meta标签, <meta ...

  8. 使你的IT职业生涯更上一层楼de14条建议

    摘要:升值为企业IT部门的领导者,是大部分IT技术人员职业生涯的最终追求.但从一般大众中脱颖而出,并非易事.仅仅把本职工作干好远远不够,还需要IT技术人员展示出投身于技术发展的奉献精神及伴随技术发展而 ...

  9. T-SQL建索引

    USE database GO   ------------开始----------- ALTER TABLE [name] DROP CONSTRAINT 主键约束    ----删除主键约束 IF ...

  10. PetaPoco源代码学习--2.TableInfo、ColumnInfo类和Cache类

    当把常用的特性填写到POCO实体类时,执行数据库操作时,需要根据实体类上的特性信息进行相应的操作,PetaPoco中的TableInfo和ColumnInfo类就是用来保存实体类上的特性信息. Tab ...