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 事务的优点 ORACLE 事务管理提供了以下优点: 1. 保证数据库的一致性和完整性。 2. 提高数据库的可靠性和稳定性。 3. 支持分布式事务和...
自治事务是指在事务中执行的独立操作,它可以在事务中执行,或者在事务外执行。自治事务可以帮助提高系统的并发性和可扩展性。 Oracle 的事务管理机制可以保证数据库的一致性和完整性,提供了原子性、一致性、隔离...
自治事务是指在分布式事务中,每个事务都可以独立地提交或回滚。自治事务可以提高系统的可扩展性和可靠性。 本论文对 Oracle 中的事务管理进行了详细的讨论,涵盖了事务的定义、特征、控制语句、原子性、一致性、...
### Oracle自治事务(Trigger)详解 #### 一、概述 Oracle数据库中的触发器是一种存储过程,它被设计为当特定事件发生时自动执行。这些事件包括数据修改操作,如INSERT、UPDATE或DELETE等。触发器可以确保数据的...
Oracle自治事务的介绍(Autonomous_Transactions) Oracle自治事务是一种特殊的数据库事务机制,允许在调用事务的上下文中执行独立的事务。这种机制使用PRAGMA_AUTONOMOUS_TRANSACTION语句来定义自治事务。自治事务...
自治事务是与主事务相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,反过来情况就不同了:主事务能够检测到已经...
为了保护数据的完整性,我们需要了解 Oracle 中的事务机制和自治事务的使用方法。在处理数据直接的事务的时候,保存数据的完整性是非常重要的。我们可以使用多种方法来保护数据的完整性,例如数据表的主键约束、外键...
### 事务与锁定的问题:自治事务详解 #### 一、事务与锁定的基础 在数据库管理中,事务(Transaction)和锁定(Locking)是保证数据完整性和一致性的重要机制。事务被视为一系列操作的集合,这些操作要么全部成功...
4. 自动化事务处理:Oracle 自治数据库提供了自动化事务处理功能,可以自动处理事务,提高数据库的可用性和性能。 5. 自动化数据保护:Oracle 自治数据库提供了自动化数据保护功能,可以自动保护数据的安全和完整性...
Oracle自治事务(Autonomous Transaction)机制可以解决这个问题,确保触发器和存储过程之间的事务独立性。 触发器调用存储过程的过程中可能会出现的问题是,insert语句不是自动提交的,因此当insert语句没有提交时...
在Oracle自治数据库中,还有许多其他的特征,例如自动化索引、自动化事务处理、自动化数据保护等。这些特征可以帮助数据库管理员更方便地管理数据库,提高数据库的性能和安全性。 Oracle自治数据库提供了两种部署...
- 该接口允许Python代码执行SQL语句和存储过程调用,处理结果集,并管理事务。 - 该模块使用Oracle的客户端库与Oracle数据库交互。 - cx_Oracle支持Python的异步框架以及多个线程和进程在同一会话中安全运行。 ### ...
此外,通过自动健康架构和诊断框架,Oracle自治数据库能够自我监测和修复问题,确保系统的稳定运行。 在安全性方面,自治数据库提供了自动防御机制,能够抵御外部攻击,检测并修复潜在的安全异常。同时,它能根据...
- 自治事务:可以在主事务内部执行的独立子事务,有自己的提交和回滚逻辑。 - 事务隔离级别和死锁处理。 第6章和第7章可能涉及了更高级的主题,如安全性、备份与恢复、性能优化等,但具体内容没有给出。 总的来说...
- **自治事务的作用**:自治事务主要用于审计和日志记录,因为它可以确保即使在外部事务失败的情况下,关键的日志信息也能被正确记录。 #### 八、小结 通过本章的学习,我们深入理解了Oracle数据库中事务的基本...
- **4.3 自治事务纵览**:自治事务是一种特殊的事务处理方式,它不受外部事务的影响,主要用于复杂事务处理场景。 #### 第5章:模式对象 - **5.1 模式对象简介**:模式对象是数据库中由模式拥有者所创建的对象,...
- 自治事务:在主事务内部,可以执行一个独立的、不依赖于主事务的子事务,其结果在主事务提交或回滚时不受影响。 - 分布式事务和两时期提交:在分布式数据库环境下,事务可能涉及多个数据库节点。两时期提交协议...