`
JAVA天地
  • 浏览: 673406 次
  • 性别: Icon_minigender_1
  • 来自: 太原
文章分类
社区版块
存档分类
最新评论

ORACLE中的自治事务

阅读更多

这是一个非常实用的功能,特别用在记录错误日志同时要回滚主事务的时候,我们在实际开发中就是这么用的,感觉还是很方便的。转载一篇详细的介绍,感谢原作者。

在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题.,比如想在执行当前一个由多个DML组成的transaction(事务)时,为每一步DML记录一些信息到跟踪表中,由于事务的原子性,这些跟踪信息的提交将决定于主事务的commit或rollback.这样一来写程序的难度就增大了,程序员不得不把这些跟踪信息记录到类似数组的结构中,然后在主事务结束后把它们存入跟踪表.哎,真是麻烦!

有没有一个简单的方法解决类似问题呢?

ORACLE8iAUTONOMOUSTRANSACTION(自治事务,以下AT)是一个很好的回答。

AT是由主事务(以下MT)调用但是独立于它的事务。在AT被调用执行时,MT被挂起,在AT内部,一系列的DML可以被执行并且commit或rollback.

注意由于AT的独立性,它的commit和rollback并不影响MT的执行效果。在AT执行结束后,主事务获得控制权,又可以继续执行了。

如何实现AT的定义呢?我们来看一下它的语法。其实非常简单。

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

可以加自治事务的有:

1.顶级的匿名PL/SQL块

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

3.SQLObjectType的方法

4.触发器。

比如:

在一个独立的procedure中声明AT

CREATEORREPLACEPROCEDURE

Log_error(error_msgINVARCHAR2(100))

IS

PRAGMAAUTONOMOUS_TRANSACTION;

BEGIN

InsertintoError_logvalues(sysdate,error_msg);

COMMIT;

END;

下面我们来看一个例子,(win2000advancedserver+oracle8.1.6,connectasscott)

建立一个表:

createtablemsg(msgvarchar2(120));

首先,用普通的事务写个匿名PL/SQL块:

declare

cntnumber:=-1;--}Globalvariables

procedurelocalis

begin

selectcount(*)intocntfrommsg;

dbms_output.put_line('local:#ofrowsis'||cnt);

insertintomsgvalues('NewRecord');

commit;

end;

begin

deletefrommsg;

commit;

insertintomsgvalues('Row1');

local;

selectcount(*)intocntfrommsg;

dbms_output.put_line('main:#ofrowsis'||cnt);

rollback;

local;

insertintomsgvalues('Row2');

commit;

local;

selectcount(*)intocntfrommsg;

dbms_output.put_line('main:#ofrowsis'||cnt);

end;

运行结果(注意打开serveroutput)

local:#ofrowsis1->子程序local中可以’看到’主匿名块中的uncommitted记录

main:#ofrowsis2->主匿名块可以’看到’2条记录(它们都是被localcommit掉的)

local:#ofrowsis2->子程序local首先’看到’2条记录,然后又commit了第三条记录

local:#ofrowsis4->子程序local又’看到’了新增加的记录(它们都是被localcommit掉的),然后又commit了第五条记录

main:#ofrowsis5->主匿名块最后’看到’了所有的记录.

从这个例子中,我们看到COMMIT和ROLLBACK的位置无论是在主匿名块中或者在子程序中,都会影响到整个当前事务.

现在用AT改写一下匿名块中的procedurelocal:

...

procedurelocalis

pragmaAUTONOMOUS_TRANSACTION;

begin

...

重新运行(注意打开serveroutput)

local:#ofrowsis0->子程序local中无法可以’看到’主匿名块中的uncommitted记录(因为它是独立的)

main:#ofrowsis2->主匿名块可以’看到’2条记录,但只有一条是被commited.

local:#ofrowsis1->子程序local中可以’看到’它前一次commit的记录,但是主匿名块中的记录已经被提前rollback了

local:#ofrowsis3->子程序local中可以’看到’3条记录包括主匿名块commit的记录

main:#ofrowsis4->主匿名块最后’看到’了所有的记录.

很明显,AT是独立的,在它执行时,MT被暂停了.AT的COMMIT,ROLLBACK并不影响MT的执行.

运用AT时,有一些注意事项,简单列举如下:

1.在匿名PL/SQL块中,只有顶级的匿名PL/SQL块可以被设为AT

2.如果AT试图访问被MT控制的资源,可能有deadlock发生.

3.Package不能被声明为AT,只有package所拥有的function和procedure才能声明为AT

4.AT程序必须以commit或rollback结尾,否则会产生Oracle错误ORA-06519:activeautonomoustransactiondetectedandrolledback

在程序开发时,如果充分运用AUTONOMOUSTRANSACTION的特性,一定能取得事倍功半的效果.

<!--EndFragment-->
分享到:
评论

相关推荐

    Oracle自治事务的介绍(Autonomous_Transactions)

    Oracle自治事务是一种特殊的数据库事务机制,允许在调用事务的上下文中执行独立的事务。这种机制使用PRAGMA_AUTONOMOUS_TRANSACTION语句来定义自治事务。自治事务可以是存储过程、函数、本地过程、打包过程、类型...

    oracle自治事务(Trigger)

    ### Oracle自治事务(Trigger)详解 #### 一、概述 Oracle数据库中的触发器是一种存储过程,它被设计为当特定事件发生时自动执行。这些事件包括数据修改操作,如INSERT、UPDATE或DELETE等。触发器可以确保数据的...

    Oracle中怎样用自治事务保存日志表

    要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL Server语句都是自治的。

    Oracle数据完整性嵌套事务调用分析研究

    为了保护数据的完整性,我们需要了解 Oracle 中的事务机制和自治事务的使用方法。在处理数据直接的事务的时候,保存数据的完整性是非常重要的。我们可以使用多种方法来保护数据的完整性,例如数据表的主键约束、外键...

    事务与锁定的问题 自治事务

    自治事务(Autonomous Transaction)是一种特殊的事务类型,它可以在主事务的执行过程中独立启动和提交,不受主事务的提交或回滚的影响。自治事务主要用于日志记录、审计、通知等功能,确保即使主事务失败,关键的...

    ORACLE-事务ORACLE-TRANSACTION-信息管理与信息系统本科毕业设计.doc

    自治事务可以在事务中执行一些特殊的操作,如日志记录和错误处理。 ORACLE 事务的优点 ORACLE 事务管理提供了以下优点: 1. 保证数据库的一致性和完整性。 2. 提高数据库的可靠性和稳定性。 3. 支持分布式事务和...

    oracle-事务oracle-transaction信息管理与信息系统学士学位论文.doc

    自治事务是指在分布式事务中,每个事务都可以独立地提交或回滚。自治事务可以提高系统的可扩展性和可靠性。 本论文对 Oracle 中的事务管理进行了详细的讨论,涵盖了事务的定义、特征、控制语句、原子性、一致性、...

    oracle-事务oracle-transaction信息管理与信息系统.doc

    自治事务是指在事务中执行的独立操作,它可以在事务中执行,或者在事务外执行。自治事务可以帮助提高系统的并发性和可扩展性。 Oracle 的事务管理机制可以保证数据库的一致性和完整性,提供了原子性、一致性、隔离...

    Oracle自治数据库和自动化运维新特性概述.pptx

    6. 自动化故障检测和恢复:Oracle 自治数据库提供了自动化故障检测和恢复功能,可以自动检测和恢复数据库中的故障。 7. 自动化升级和扩展:Oracle 自治数据库提供了自动化升级和扩展功能,可以自动升级和扩展数据库...

    oracle触发器调用存储过程

    Oracle自治事务(Autonomous Transaction)机制可以解决这个问题,确保触发器和存储过程之间的事务独立性。 触发器调用存储过程的过程中可能会出现的问题是,insert语句不是自动提交的,因此当insert语句没有提交时...

    Oracle自治数据库和自动化运维新特性概述.pdf

    在Oracle自治数据库中,还有许多其他的特征,例如自动化索引、自动化事务处理、自动化数据保护等。这些特征可以帮助数据库管理员更方便地管理数据库,提高数据库的性能和安全性。 Oracle自治数据库提供了两种部署...

    基于Oracle自治数据库快速开发智能分析应用.pptx

    此外,通过自动健康架构和诊断框架,Oracle自治数据库能够自我监测和修复问题,确保系统的稳定运行。 在安全性方面,自治数据库提供了自动防御机制,能够抵御外部攻击,检测并修复潜在的安全异常。同时,它能根据...

    oracle_专家高级编程 中文 第八章

    - **自治事务定义**:自治事务是一种特殊的事务类型,它可以嵌套在另一个事务中运行,并且独立于外部事务。这意味着,无论外部事务是否成功,自治事务的结果都会被提交。 - **自治事务的作用**:自治事务主要用于...

    Clinet端工具连接Oracle数据库的jar

    它提供了对Oracle数据库的所有功能的访问,包括SQL查询、事务处理、存储过程等。 2. **ojdbc6.jar**: 和ojdbc7.jar类似,但它是为Java 6设计的。虽然Java 6已经过时,但在某些旧系统中仍然广泛使用。这个驱动同样...

    富士通内部培训ORACLE资料

    12. **设置自治事务**:自治事务允许在主事务内创建独立的小事务,其提交或回滚不会影响主事务的状态。使用`PRAGMA AUTONOMOUS_TRANSACTION`开启自治事务。 13. **在过程中暂停指定时间**:可以使用`DBMS_LOCK....

    oracle开发常用知识

    自治事务是一种特殊的Oracle事务处理机制,主要用于解决在存储过程或函数内部进行独立于外部事务控制的数据库操作需求。自治事务的特点在于它们不会受到外部事务的影响,并且在完成自身操作后会自动提交或回滚。 ##...

    Oracle10gConcepts_Oracle官方文档_中文翻译.doc

    - 自治事务:可以在主事务内部执行的独立子事务,有自己的提交和回滚逻辑。 - 事务隔离级别和死锁处理。 第6章和第7章可能涉及了更高级的主题,如安全性、备份与恢复、性能优化等,但具体内容没有给出。 总的来说...

    oracle大数据分析方案

    10. **云服务**:Oracle提供了云数据库服务,如Oracle自治数据库,用户可以在云端轻松管理和运行大数据分析工作负载,享受弹性伸缩和成本效益。 以上知识点涵盖了Oracle在大数据分析领域的关键技术和解决方案,对于...

Global site tag (gtag.js) - Google Analytics