PLSQL_自治事务和嵌套事物的理解和用法(案例)

简介: 2014-06-01 Created By BaoXinjian 一、摘要 嵌套事物:指在一个Parent事务中嵌套的一个或多个Sub Transaction.并且主事务与其相互影响,这种事务就称为嵌套事务。

2014-06-01 Created By BaoXinjian

一、摘要


嵌套事物:指在一个Parent事务中嵌套的一个或多个Sub Transaction.并且主事务与其相互影响,这种事务就称为嵌套事务。以Commit作为事务的结束

自治事物:指在function,procedure等subprograms中对事务进行自治管理,当在别的pl/sql block里去调用这些subprograms的时候这些subprograms并不随着父pl/sql block的失败而回滚,而是自己管自己commit。以Commit作为事务的结束。自治事务常用于写入LOG或TRAC信息便于查找错误。

个人感觉,一般嵌套事物因为采用savepoint&rollback这种方式进行回滚,会破坏程式的可读性及模块化,特别有多个savepoint&rollback在程式中,可能连自己写的人会混淆,更何况项目运维过程中的维护人员,所以一般在写程式标准中,会禁止使用嵌套事物

而自治事物可将程式的模块化,一般来说是推荐的写法,将主事物和子事物进行隔离,所以后面也会对自治事物做详细的解读

 

二、嵌套事物 SavePoint


1. 基本作用:建立回滚节点,之后如回滚直接回滚此节点,此节点之前仍会Commit

2. 基本语法

SAVE_POINT my_savepoint;
... ...
ROLLBACK to my_savepoint;

3. 因是开发过程中不推荐的写法,所以案列就略去了;)

 

三、自治事物 autonomous_transation


1. 基本作用:

当proc1调用proc2后,proc1执行Rollback后,proc2仍旧会进行Commit;

采用的基本语法是在申明proc2时加入 pragma autonomous_transaction;

2. 基本语法

 申明proc2为自治事务

 1 create or replace procedure proc2
 23 as pragma autonomous_transaction;
 45 begin
 67 insert into log_info values (user, sysdate, 'insert');
 89 commit;
10 
11 end;

3. 自治事务的一个例子

3.1 申明一个自治事物xxautonomouse_insert

 1  procedure xxautonomouse_insert is
 2 
 3   pragma autonomous_transaction;
 4 
 5  begin
 6 
 7   insert into xxap_viktor_autonomous
 8 
 9        values(001, 'xxap_invoice_20140410_01');
10 
11   commit; --自治事务中commit
12 
13  end;

 3.2 申明一个主事物,在主事物中调用自治事物,

 1 procedure xxautonomouse_main is
 2 
 3  begin
 4 
 5   xxautonomouse_insert;
 6 
 7   insert into xxap_viktor_autonomous
 8 
 9         values(002, 'xxap_invoice_20140410_02');
10 
11   rollback; --主事务中rollback
12 
13  end; 

  3.3 在主事物中进行rollback,并不影响自治事务的commit和rollback,实现了事物间的隔离

4. 自治事务的概念

(1) 带 ALTER SESSION 的自治事务 自治事务应该与主事务共享一个会话,因此通过 ALTER SESSION 语句,对该会话的任何修改,对自治事务和主事务应该都是可见的。但自治事务执行与主事务不同的上下文中。任何从自治块中引发的自治子程序调用都与自治事务共享相同的事务上下文

(2) 自治事务与死锁 必须以下面的这种方式定义自治事务: 死锁在自治事务试图访问一个被主事务占用的资源时发生,这时主事务会挂起,直到自治事务结束。自治事务死等主事务释放资源,结果可能导致死锁

(3) 定义自治事务的条件 只有顶层匿名块才能包括 PRAGMA AUTONOMOUS_TRANSTRACTION(4) COMMIT 或 ROLLBACK 行为与自治事务 自治事务是以 commit 或 rollback 语句结束的。因此,应该在自治事务程序的内部显式地包含一个 commit 或 rollback 语句。如果没有这样做,任何一个未确定的事务都会回滚。这是一个事务级的回滚,而不是一个语句级的回滚

(5) 异常与自治事务 当自治事务以一个异常的方式退出时,就发生一个事务级的回滚,自治事务中所有未确定的改变都会回滚

(6) 多个自治事务 一个自治事务的上下文中,初始化多个自治事务。可以在一个自治块内定义多个 commit 或 rollback 语句来完成这项任务,当包含一个 rollback 时,它就会属于当前事务,而不属于主事务

(7) 自治事务的并发问题 自治事务与主事务是并发运行的,初始化文件 init.ora 中的 transactions 参数决定着每个会话中并发事务的数量

 

Thanks and Regards

参考:lxzo123 http://blog.csdn.net/lxzo123/article/details/5942003

参考:hwhuang http://zohan.group.iteye.com/group/wiki/2297-oracle-transaction


 

Thanks and Regards

ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关文章
|
3月前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
40 1
|
SQL 存储 关系型数据库
MySQL基础下篇[表的创建/约束的使用/事务和范式以及索引的使用]~1
MySQL基础下篇[表的创建/约束的使用/事务和范式以及索引的使用]~
|
存储 SQL 关系型数据库
MySQL基础下篇[表的创建/约束的使用/事务和范式以及索引的使用]~2
MySQL基础下篇[表的创建/约束的使用/事务和范式以及索引的使用]~2
|
SQL 存储 关系型数据库
MySQL基础下篇[表的创建/约束的使用/事务和范式以及索引的使用]~3
MySQL基础下篇[表的创建/约束的使用/事务和范式以及索引的使用]~
|
Java 数据库 Spring
清晰、明了的@Transcation事务嵌套使用
清晰、明了的@Transcation事务嵌套使用
|
存储 关系型数据库 MySQL
MySQL基础篇——流程控制结构
MySQL基础篇——流程控制结构
84 0
|
SQL
SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)(二)
SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)(二)
155 0
SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)(二)
|
SQL 安全 数据处理
SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)(一)
SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)(一)
130 0
SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)(一)
|
SQL 数据库
SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)(三)
SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)(三)
135 0
SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)(三)
|
SQL 关系型数据库 MySQL
【MySQL作业】DDL 和 DML——美和易思使用 DDL 定义数据库表结构应用习题
【MySQL作业】DDL 和 DML——美和易思使用 DDL 定义数据库表结构应用习题
154 0