Oracle自主事务处理

oracle 自主事务处理怎么理解,没有自主事务处理会有什么弊端呢?

2013-03-22 10:20 4358673ym | 分类:数据库DB
 
 
2013-03-22 10:26 提问者采纳
热心网友
自主事务处理, 就是 我这个存储过程里面,  自己管理事务处理。

我自己的对数据作了修改, 提交了,那么就提交了。
无视外部的事务, 是否提交或者回滚。

这个主要用于一些特殊的情况, 例如 安全审核记录的处理。
例如 有人要更新某个 很重要的表。
那么我要记录这个 更新的日志信息。 是谁,什么时间,什么机器更新的。

无论这个人, 本次更新操作是否成功, 我都要记录。

没有自主事务处理的情况下, 上面这种情况。

如果那个人更新成功了, 那么我的日志也成功。
如果那个人, 更新了, 然后 roolback 了, 那么我的日志也 回滚了。

SQL> select * from test_main;

ID VALUE
---------- --------------------
2 TWO
3 THREE
1 ONE

SQL> CREATE OR REPLACE PROCEDURE Autonomous_Insert
2 AS
3 -- 定义 “自治事务”
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6 INSERT INTO test_main(id, value) VALUES (5, 'FIVE');
7 COMMIT;
8 END;
9 /

Procedure created.

SQL> BEGIN
2 -- 非自治事务的语句.
3 INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
4 -- 自治事务
5 Autonomous_Insert;
6 -- 非自治事务回滚,不影响自治事务.
7 rollback;
8 END;
9 /

PL/SQL procedure successfully completed.

SQL> select * from test_main;

ID VALUE
---------- --------------------
5 FIVE
2 TWO
3 THREE
1 ONE
 

    1. --当一个子程序调用另外一个子程序时,事务提交或回滚都将影响两个子程序  
    2. --为防止一个子程序的事务影响其他子程序,可以将这个子程序标记为自主事务处理  
    3. --这样自主事务成为一个独立的事务处理,不影响其他子程序的事务  
    4. --pragma autonomous_transaction 用于标记子程序为自主事务处理  
    5.   
    6. --自主事务过程  
    7. create or replace procedure proc_tran1  
    8. as  
    9.   v_sal emp.sal%type;  
    10.   pragma autonomous_transaction;--指定为自主事务  
    11. begin  
    12.   select sal into v_sal from emp where empno=7788;  
    13.   dbms_output.put_line('proc_tran1中显示7788的薪水:'||v_sal);  
    14.   rollback;  --回滚事务  
    15. end;  
    16.   
    17. --主事务过程  
    18. create or replace procedure proc_tran2  
    19. as  
    20.     v_sal emp.sal%type;  
    21. begin  
    22.   update emp set sal=6666 where empno=7788;-- 修改7788薪水  
    23.   proc_tran1();--调用自主事务过程  
    24.   commit;  
    25.   select sal into v_sal from emp where empno=7788;  
    26.   dbms_output.put_line('proc_tran2中显示7788的薪水:'||v_sal);  
    27. end

Oracle之自治事务

昨天处理项目中的一个业务需求要用到触发器实现,触发器中涉及到在 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语句都是自治的。

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/edwardsun/p/3490326.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值