这次介绍一下“自治事物”相关内容。
所谓“自治事物”,就是自己的子程序内部自行管理事务,和调用方的事务无关。
也就是在一系列长处理中一部分处理进行自己的独立的事务管理。
即使主交易被回滚,子处理的部分是作为独立的处理进行管理的,与原来的处理是分开的。
我们用简单的例子来演示一下吧。
首先要准备一张名为“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到审计表中”这样的处理,如果以自治事务进行的话,最终即使主处理事务被取消,该段操作也是可以作为审计记录保留下来的。
这就是自治事务的概念和用途。
可以结合数据库的触发器和上述的子程序自治事务功能,来实现监察记录,我们下次再见把。