PRAGMAAUTONOMOUS_TRANSACTION
数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败。在Oracle中,一个事务是从执行第一个数据管理语言(DML)语句开始,直到执行一个COMMIT语句,提交保存这个事务,或者执行一个ROLLBACK语句,放弃此次操作结束。
事务的“要么全部完成,要么什么都没完成”的本性会使将错误信息记入数据库表中变得很困难,因为当事务失败重新运行时,用来编写日志条目的INSERT语句还未完成。
针对这种困境,Oracle提供了一种便捷的方法,即自治事务。自治事务从当前事务开始,在其自身的语境中执行。它们能独立地被提交或重新运行,而不影响正在运行的事务。正因为这样,它们成了编写错误日志表格的理想形式。在事务中检测到错误时,您可以在错误日志表格中插入一行并提交它,然后在不丢失这次插入的情况下回滚主事务。
因为自治事务是与主事务相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,反过来情况就不同了:主事务能够检测到已经执行过的自治事务的结果。
要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMAAUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL Server语句都是自治的。
触发无法包含COMMIT语句,除非有PRAGMAAUTONOMOUS_TRANSACTION标记。但是,只有触发中的语句才能被提交,主事务则不行。
exp:
Create table Msg (Msg varchar(50)) ;
自制事务:
create or replace procedure AutoNomouse_Insert is
PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into Msg values('AutoNomouse Insert');
commit;
end;
非自治事务:
CREATE ORREPLACE Procedure NonAutoNomouse_Insert as
begin
insert into Msg Values('NonAutonomouse Insert');
commit;
end;
SQL> begin
2
3insert into Msg Values('This Main Info');
4
5NonAutoNomouse_Insert;
6
7rollback;
8
9end
10;
11/
PL/SQL procedure successfully completed
SQL> select * from msg;
MSG
--------------------------------------------------
This Main Info
NonAutonomouseInsert
因为过程中有COMMIT;所以匿名块中得RULLBACK 是不起作用的;由此得出:非自治事务中的COMMIT,ROLLBACK
是会影响整个事务的。
下面我们看一个另外一种情况:
SQL> delete msg;
2 rows deleted
SQL>
这里没有COMMIT;
SQL> begin
2
3insert into Msg Values('This Main Info');
4
5rollback;--这里加了ROLLBACK;
6
7NonAutoNomouse_Insert;
8
9rollback;
10
11end
12;
13/
PL/SQL procedure successfully completed
SQL> select * from msg;
MSG
--------------------------------------------------
This Main Info
NonAutonomouse Insert
NonAutonomouse Insert
竟然没有ROLLBACK (DELETE* FROM SSG ;) 为什么了? 因为过程就是一个新的SESSION,所以前面的SESSION
被正常EXIT,同时被自动提交; 所以我们会看到三行数据。
SQL> commit;
Commit complete
SQL> select * from msg;
MSG
--------------------------------------------------
This Main Info
NonAutonomouse Insert
NonAutonomouse Insert
SQL> commit;
Commit complete
SQL> select * from msg;
MSG
--------------------------------------------------
This Main Info
NonAutonomouse Insert
NonAutonomouse Insert
因为这里一个新的SESSION 所以是没有意义的事务控制语句。
SQL> deletemsg;
3 rows deleted
SQL> commit;
Commit complete
SQL> select * from msg;
MSG
--------------------------------------------------
可以看到这里是正常的提交;
下面看一下自制事务:
SQL> begin
2
3insert into Msg Values('This Main Info');
4
5AutoNomouse_Insert;
6
7rollback;
8
9end
10
11;
12/
PL/SQL procedure successfully completed
SQL> select * from msg;
MSG
--------------------------------------------------
AutoNomouse Insert
我们看到是一行数据,显然第一条SQL INSERT 是被ROLLBACK,证明自制事务是一个独立于主程序的事务,
他不会对主事务的控制产生影响。另外在分布式环境中我们经常会遇到 ORA-02064 ERROR,就是因为主事务
自己有事务控制语句,然而被调用的远程过程也有自己的事物控制语句,当然就会报错,我们将被调用的过程
声明为自制事务那就OK了。
分享到:
相关推荐
Oracle自治事务的介绍(Autonomous_Transactions)PRAGMA_AUTONOMOUS_TRANSACTION
自治事务是与主事务相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,反过来情况就不同了:主事务能够检测到已经...
在触发器中使用自制事务及调用存储过程 Declare Pragma Autonomous_Transaction; ...
oracle 触发器 调用 存储过程 Oracle自治事务(Autonomous Transaction)
CruiseYoung提供的带有详细书签的电子... 14.12 自治事务 409 14.13 小结 413 第15章 测试与质量保证 415 15.1 测试用例 416 15.2 测试方法 417 15.3 单元测试 418 15.4 回归测试 422 15.5 模式修改 422 15.6...
Oracle自治事务处理数据库(Oracle ATP)AES256-CBC与其他数据库之间的互操作性 动机 现代软件系统之间的互操作性对于客户而言尤其重要。 借助我的Always Free Oracle ATP中的Oracle RESTful数据服务(ORDS)技术,...
对子程序的调用者权限、管道表函数、传递触发器标识:new和:old以及自治事务也给出了具体的解决方法。第8 章 LOB与面向对象的数据管理. 第9章 Oracle的监听器和网络设置。包括Oracle网络体系结构,Oracle Net参数文件...
第一部分 ORACLE系统优化基本知识 23 第1章 ORACLE结构回顾 23 §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1...
对子程序的调用者权限、管道表函数、传递触发器标识:new和:old以及自治事务也给出了具体的解决方法。第8 章 LOB与面向对象的数据管理. 第9章 Oracle的监听器和网络设置。包括Oracle网络体系结构,Oracle Net参数文件...
8.6.1 自治事务如何工作? 273 8.6.2 何时使用自治事务? 276 8.7 小结 279 第9章 redo与undo 281 9.1 什么是redo? 281 9.2 什么是undo? 282 9.3 redo和undo如何协作? 285 9.4 提交和回滚处理 289 9.4.1 ...
第 1章 开发成功的Oracle应用程序...................................................... 61 1.1 我的方法................................................................................ 63 3 / 976 1.2 ...
文件夹的组织如下: :启动VCN,计算实例和自治事务处理数据库。 :启动VCN,计算实例和Bare Metal Database System。 :启动VCN,计算实例和Exadata云服务数据库系统。 :启动VCN,计算实例和虚拟机数据库系统。...
[Q]怎么样设置自治事务 5 [Q]怎么样在过程中暂停指定时间 5 [Q]怎么样快速计算事务的时间与日志量 5 [Q]怎样创建临时表 6 [Q]怎么样在PL/SQL中执行DDL语句 6 [Q]怎么样获取IP地址 7 [Q]怎么样加密存储过程 7 [Q] 7 ...
怎么获得今天是星期几,还关于其它日期函数用法 [Q]随机抽取前N条记录的问题 [Q]抽取从N行到M行的记录,如从20行到30行的记录 [Q]怎么样抽取重复记录 [Q]怎么样设置自治事务 [Q]怎么样在过程中暂停指定时间 [Q]...
《Oracle自治式云服务解决方案》-刘群策.pdf 《Prometheus监控系统最佳实践与常见陷阱》-Julius Volz.pdf 《Raft在百度云的实践》-王耀.pdf 《RandonDb新一代分布式关系型数据库》-张雁飞.pdf 《Reactive架构升级...
9:数据装载 10:优化策略和工具 11:优化器方案稳定性 12:分析函数 13:物化试图 14:分区 15:自治事务 16:动态SQL 17:intermedia 18:基于C的外部过程 19:JAVA存储过程 20:使用对象关系特性 21:精细存取控制...
9:数据装载 10:优化策略和工具 11:优化器方案稳定性 12:分析函数 13:物化试图 14:分区 15:自治事务 16:动态SQL 17:intermedia 18:基于C的外部过程 19:JAVA存储过程 20:使用对象关系特性 21:精细存取控制...
Oracle自治数据库是一个创新的数据平台,包括事务数据,关系数据,nosql和分析数据。 在这段时间内,我们将构建一个包含事务处理应用程序和分析应用程序的集成数据平台。 在此期间,我们将执行的主要主题是: 1....