PLSQL入门与精通(第56章:子程序里的自治事务处理)

这次介绍一下“自治事物”相关内容。

所谓“自治事物”,就是自己的子程序内部自行管理事务,和调用方的事务无关。

也就是在一系列长处理中一部分处理进行自己的独立的事务管理。

即使主交易被回滚,子处理的部分是作为独立的处理进行管理的,与原来的处理是分开的。

我们用简单的例子来演示一下吧。

首先要准备一张名为“TEST01表”的简单的表。
针对这个表进行4行INSERT处理,其中途中的2行用自治事务来进行插入。

并且,进行ROLLBACK的话,4行中只有自治事务的那2行INSERT的有效,其他2行处理可以取消。

SQL> CREATE TABLE TEST01
2 ( A NUMBER,
3 B VARCHAR2(10));

表创建成功。

接下来,在TEST01表中创建进行INSERT的存储过程。
在此过程中指定了自治事务。

SQL> CREATE OR REPLACE PROCEDURE PROC1 ( P1 IN NUMBER,
2 P2 IN VARCHAR2)
3 IS
4 PRAGMA AUTONNOMOUS_TRANSACTION;–自治事务
5 BEGIN
6 INSERT INTO TEST01(A,B) VALUES (P1,P2);
7 COMMIT;–自治事务最后必须是COMMIT或ROLLBACK
8 END;
9 /

程序已创建。

这个过程的功能:对表TEST01进行INSERT操作,插入的值是参数指定的值,第4行用“PRAGMA AUTONNOMOUS_TRANSACTION;指定该操作数据自治事务,和调用方的事务是独立开的。

因此,第7行的COMMIT仅提交该子过程中的处理,不会提交调用方的主事务。

另外需要注意的是,自治事务必须针对的是子程序。
也就是说,无名块或嵌套块的形式是不能指定为自治事务的。

那么,让我们马上确认一下上边的说法把:

首先,针对TEST01表进行4行INSERT操作,但是一部分行的INSERT使用的是上述定义的子过程。

请看下面的例子:

SQL> BEGIN
1 --普通INSERT(主事务的开始)
2 INSERT INTO TEST01(A,B) VALUES (10,‘AB’);
3 —通过自治事务INSERT 进行提交,数据是20号和30号
4 PROC1(20,‘CD’);
5 PROC1(30,‘EF’);
6 —回到主事务,INSERT40号
7 INSERT INTO TEST01(A,B) VALUES (40,‘GH’);
8 END;
9 /

PL/SQL过程成功完成。

SQL> SELECT * FROM TEST01;
A B


10 AB
20 CD --自治事务提交的行
30 EF --自治事务提交的行
40 GH

↑现在有4行

SQL> ROLLBACK;

回滚完成。

SQL> SELECT * FROM TEST01;
A B


20 CD
30 EF

↑即使ROLLBACK,自治事务中INSERT的行也不会被回滚。

简单地解说一下:
首先,INSERT10号的数据。
如果事务还没有开始,则事务从此默认开始(主事务)。
然后,在自治事务的过程中,INSERT 20号和30号的行。
这个INSERT处理是自治事务,所以不会影响主交易的提交。
最后又回到主事务,INSERT了40的行。
因此,最初和最后一行(10号和40号)还没有提交。

所以最后执行ROLLBACK的话,10号和40号的行会被回滚,自治事务中INSERT的20号和30号的行没被回滚,被提交了。

像这样,即使主事务被ROLLBACK了,子程序的自治事务也是独自管理的,相互不会传递和影响。

这个功能在实际业务中也是有作用的,譬如作为代表性的业务处理,为了审计和安全,必须要把其中一部分操作作为历史记录保留下来,以备后续进行审查或者找回操作记录。

例如,“将谁、何时、哪张表、哪一行、哪一列更新为哪一个值的记录,INSERT到审计表中”这样的处理,如果以自治事务进行的话,最终即使主处理事务被取消,该段操作也是可以作为审计记录保留下来的。

这就是自治事务的概念和用途。

可以结合数据库的触发器和上述的子程序自治事务功能,来实现监察记录,我们下次再见把。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值