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

2014-06-01 BaoXinjian In
Capgemini

一、摘要

嵌套事物:指在一个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
参数决定着每个会话中并发事务的数量

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

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

Thanks and Regards

时间: 2024-08-04 13:11:52

PLSQL_自治事务和嵌套的理解和用法(案例)的相关文章

Oracle与SQL自治事务

自治事务 自治事务是独立的事务操作,如果考虑到事务回滚,必须单独写成一个触发器来完成, 一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的事务的影响. 如果session从B事务开始——A事务开始和结束——B事务结束 上述的A事务不受没有完成的B事务的影响,然后A事务执行完毕后再次回到B事务执行没有完成的B事务. 通过pragma autonomous_transaction将一个pl/sql程序结构设定为自治事务,pragma是编译

[课]12演示save point及自治事务的用处

1.确认数据库版本 2 举一个例子,说明save point的用处,给出SQL演示. 2.1环境准备 save point的作用是通过在事务中间设置检查点,可以更加精细的控制事务,防止一部分操作错误而导致整个事务重新运行. 现在我们创建一张测试表,并插入3条测试数据: 2.2演示save point的用处 现在我们将对TEST表做修改操作,具体步骤如下: 3 写一个用于审计的触发器,利用自治事务技术. 3.1创建测试表 我们创建两张测试表TEST和TEST_AUDIT,其中TEST用来表示正式的

Oracle的自治事务

自治事务(autonomous transaction)允许你创建一个"事务中的事务",它能独立于其父事务提交或回滚.利用自治事务,可以挂起当前执行的事务,开始一个新事务,完成一些工作,然后提交或回滚,所有这些都不影响当前所执行事务的状态.自治事务提供了一种用PL/SQL控制事务的新方法,可用于: 顶层匿名块: 本地(过程中的过程).独立或打包的函数和过程: 对象类型的方法: 数据库触发器. 使用例子演示自治事务如何工作 --创建测试表用于保存信息 [email protected]&

事务的隔离性理解

事务处理之父Jim Gray对事务隔离性的定义: Isolation: Concurrently executing transactions see the stored information as if they were running serially (one after another). 事务的隔离级别从低到高有:Read Uncommitted:最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果.所有的并发事务问题都会发生.Read Committed:只有

Oracle自治事务实际用例

如下,新建两个存储过程: 在主自治事务中,我们插入一条记录,然后在自治事务中,查看表中行数,然后尝试插入三条记录,查看行数,最后rollback 查看行数,最后返回主事务,查看行数. 1.如下代码: --主事务 PROCEDURE p_test_at_and_mt IS cnt NUMBER := -1; BEGIN INSERT INTO msg VALUES ('father Record'); SELECT COUNT(*) INTO cnt FROM msg; dbms_output.p

Oracle 通过触发器 来创建 同步临时表 及处理 通过 自治事务 来解决 查询 基表的问题

// 触发器 create or replace trigger tr_sync_BD_MARBASCLASS after INSERT or UPDATE on BD_MARBASCLASS for each row declare v_cnt integer; PRAGMA AUTONOMOUS_TRANSACTION; -- 自治事务 begin /** * Name : tr_sync_BD_MARBASCLASS * Desc : 物料分类 增量同步 触发器 * Author : wu

关于自治事务和锁 PRAGMA AUTONOMOUS_TRANSACTION & LOCK

之前遇到的一个问题, 可以稳定重现. Oracle 的 INV 提供了一个接口 inv_lot_api_pub.auto_gen_lot() , 用来自动为 item 产生 lot number, 调用一次这个接口, lot number 就会自动 + 1; 看里头的代码, 是先从 MTL_SYSTEM_ITEMS 这个表里面取出一个字段 start_auto_lot_number, 比方说取出来的数值是1000, 那么就会把 1000 当做当前的 lot number, 接着会调用一个 pro

oracle自治事务

自治事务的使用,独立于外层的事务控制 create or replace procedure insert_err_po( OrderNo number,CycleId number ) is pragma autonomous_transaction; begin insert into tt_err_po(po_num_id,cycle_num_id) values(OrderNo,CycleId); commit; end;

oracle:触发器,自治事务 trigger

create or replace trigger TRI_FC83_INSERT before insert ON FC83 FOR EACH ROW declare PRAGMA AUTONOMOUS_TRANSACTION; BEGIN :new.afc212 := '1'; delete from fc83 where afc001 = :new.afc001 and afa031 = :new.afa031 and afc210 = :new.afc210; commit; END T