自治事务

自治事务是独立的事务操作,如果考虑到事务回滚,必须单独写成一个触发器来完成,

一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的事务的影响。

如果session从B事务开始——A事务开始和结束——B事务结束

上述的A事务不受没有完成的B事务的影响,然后A事务执行完毕后再次回到B事务执行没有完成的B事务。

通过pragma autonomous_transaction将一个pl/sql程序结构设定为自治事务,pragma是编译器指令,

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 trigger TR_UPDT_TRIGGER
BEFORE UPDATE OF CURRENTSTATUS ON M_TABLE
FOR EACH ROW
DECLARE
e_count INTEGER;
e_sum NUMBER;
e_avg NUMBER;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
select avg(currentstatus) into e_avg
from m_businessentityextend where entityindex = :new.entityindex;
select sum(currentstatus) into e_sum
from m_businessentityextend where entityindex = :new.entityindex;
select count(currentstatus) into e_count
from m_businessentityextend where entityindex = :new.entityindex;

e_avg := (e_sum - :old.currentstatus + :new.currentstatus) / e_count;
update m_businessentity set entitystatus = (case when e_avg = 1 then 1 else 2 end) where entityindex = :new.entityindex;

COMMIT;
END;

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 – 等待资源时检查到死锁

SQL

USE [TABLE]
GO
EXEC sp_addlinkedserver @server = N'loopback' , @srvproduct = N' ' , @provider = N'SQLNCLI' , @datasrc = @@SERVERNAME
EXEC sp_serveroption loopback, N'rpc out' , 'TRUE'
EXEC sp_serveroption loopback, N'remote proc transaction promotion' , 'FALSE'
GO
BEGIN
IF (object_id('TR_UPDT_TEST_Pro', 'P') is not null)
drop proc TR_UPDT_TEST_Pro;
END
GO
CREATE proc TR_UPDT_TEST_Pro(@entityindex varchar(50),@newcurrentstatus int,@oldnewcurrentstatus int)
AS
BEGIN
DECLARE @e_count int,@e_sum numeric,@e_avg numeric;
select @e_avg=avg(currentstatus)
from m_businessentityextend where entityindex = @entityindex;
select @e_sum=sum(currentstatus)
from m_businessentityextend where entityindex = @entityindex;
select @e_count=count(currentstatus)
from m_businessentityextend where entityindex = @entityindex;
SET @e_avg= (@e_sum - @oldnewcurrentstatus + @oldnewcurrentstatus) / @e_count;
update m_businessentity set entitystatus = (case when @e_avg = 1 then 1 else 2 end) where entityindex =@entityindex;
END;
GO
BEGIN
IF (object_id('TR_UPDT_TRIGGER', 'tr') is not null)
DROP trigger TR_UPDT_TRIGGER
END;
GO
CREATE TRIGGER TR_UPDT_TRIGGER
ON M_TABLE
instead of UPDATE
AS
if update(CURRENTSTATUS)
BEGIN
DECLARE @entityindex varchar(32),@newcurrentstatus int,@oldnewcurrentstatus int;
select @entityindex=Inserted.entityindex,@newcurrentstatus=Inserted.currentstatus from Inserted;
select @oldnewcurrentstatus=deleted.currentstatus from deleted;
exec loopback. OSMP . dbo.TR_UPDT_TEST_Pro @entityindex,@newcurrentstatus,@oldnewcurrentstatus ;
END;
 以上脚本功能相同

参考链接:http://www.cnblogs.com/Ronger/archive/2012/02/15/2352527.html(摘抄)

http://blog.csdn.net/xman_78tom/article/details/5909124(模仿)

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

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

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

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

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

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

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

  4. ORACLE触发器的自治事务的注意事项

    直接上代码: Create OR replace Trigger TR_ROBXMX_CLDJBHHX After INSERT OR UPDATE OR DELETE ON ROBXMX1 --要监 ...

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

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

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

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

  7. Oracle EBS 自治事务

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

  8. 使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务

    使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务 作者:Nikolay Manchev 分步构建一个跨这些平台的 ...

  9. Oracle自治事务

    定        义: Autonomous transactions are independent transactions that can be called from within anot ...

随机推荐

  1. Linux内核中常见内存分配函数(一)

    linux内核中采 用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表. * 页全局目录(Page Global Dir ...

  2. iOS7.0中UILabel高度调整注意事项(转)

    注释:原文链接丢失. 我的“记词助手”在升级到iOS7之后,一直出现UILabel错位的问题: 我的label是用- (CGSize)sizeWithFont:(UIFont *)font const ...

  3. OC 语法基础一

    1.判断字符串开头 或 结尾 测试字符串是否以aString开始 - (BOOL)hasPrefix:(NSString *)aString; 测试字符串是否以aString结尾 - (BOOL)ha ...

  4. THP Transparent HugePages 相关知识与关闭

    近期遇到个LINUX系统内存比較大.未开 HugePages,业务有变化导致ORACLE连接数剧增至上千个,PageTables达到上百G.导致内存不足系统HANG住的案例. 因此须要开启 HugeP ...

  5. ASP.NET 验证码 不同浏览器 不刷新问题

    具体为什么不刷新是缓存机制不同,验证码图片的src或ImageUrl的获取是来自一个文件,由于连接地址没变所以不同内核浏览器有的会认为源没有变,解决办法就是在连接后面加上一个随机参数如可以用JS的Ma ...

  6. MAC xampp 启动失败

    原文地址: http://meiyitianabc.blog.163.com/blog/static/1050221272013116232752/ 问题:80port被暂用,导致server无法启动 ...

  7. 在vs2010中编译log4cxx-0.10.0详细方法

    本文一共包含了17个步骤,按照下面的步骤就可以完成vs2010中编译log4cxx的工作了. 1. 下载 log4cxx 以及 apr 和 apr-util 源码: a) http://www.apa ...

  8. Vnstat: 简单实用的网络流量统计工具

    官方主页: http://humdi.net/vnstat # Ubuntu 安装: (其本上其它发行版的包管理程序中也都包含了这款软件,请自行安装) sudo apt-get install vns ...

  9. genToken- Php file

    <?php public function genToken($len = 32, $md5 = true) { # Seed random number generator # Only ne ...

  10. MVC自学第三课

    上一课我们已经能够做出简单的HTML显示页面,并懂得了MVC的工作模式,这一课我们讲解一些动态的数据交互. 在MVC中,控制器的工作是构造某些数据,而视图的工作是把它渲染成HTML.数据是从控制器传递 ...