2014-06-01 Created By BaoXinjian

PLSQL_自治事务和嵌套事物的理解和用法(案例)_嵌套一、摘要


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

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

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

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


PLSQL_自治事务和嵌套事物的理解和用法(案例)_嵌套_02二、嵌套事物 SavePoint


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

2. 基本语法

SAVE_POINT my_savepoint;

... ...

ROLLBACK to my_savepoint;

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


PLSQL_自治事务和嵌套事物的理解和用法(案例)_回滚_03三、自治事物 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,实现了事物间的隔离

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

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

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

Thanks and Regards