发表于: 2008.07.31 23:18
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/467840
---------------------------------------------------------------
这两天看了11g的CONCEPT文档的事务部分,发现自治事务还有一些以前没有注意到的地方,这里简单总结一下。
这一篇描述自治事务的事务性特点。
小议自治事务(一):http://yangtingkun.itpub.net/post/468/467765
自治事务实现的功能是自治事务的提交或回滚不影响当前的事务。同时自治事务也是看不到当前会话所做的未提交的修改的。
SQL> TRUNCATE TABLE T_AUTO_TRANS;
表被截断。
SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 BEGIN
3 INSERT INTO T_AUTO_TRANS VALUES (2, 'TEST');
4 FOR I IN (SELECT COUNT(*) CNT FROM T_AUTO_TRANS) LOOP
5 DBMS_OUTPUT.PUT_LINE('P_TEST:' || I.CNT);
6 END LOOP;
7 END;
8 /
过程已创建。
SQL> CREATE OR REPLACE PROCEDURE P_TEST_AUTO AS
2 PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIN
4 INSERT INTO T_AUTO_TRANS VALUES (2, 'TEST');
5 FOR I IN (SELECT COUNT(*) CNT FROM T_AUTO_TRANS) LOOP
6 DBMS_OUTPUT.PUT_LINE('P_TEST_AUTO:' || I.CNT);
7 END LOOP;
8 COMMIT;
9 END;
10 /
过程已创建。
SQL> INSERT INTO T_AUTO_TRANS VALUES (1, 'TEST');
已创建 1 行。
SQL> SET SERVEROUT ON
SQL> EXEC P_TEST
P_TEST:2
PL/SQL 过程已成功完成。
SQL> EXEC P_TEST_AUTO
P_TEST_AUTO:1
PL/SQL 过程已成功完成。
可以看到,对于自治事务是看不到当前会话所作的未提交的修改的。
SQL> EXEC P_TEST
P_TEST:4
PL/SQL 过程已成功完成。
而对于当前会话,由于自治事务的操作已经提交,因此之后的查询是可以看到自治事务所进行的修改的。
自治事务看不到当前会话的修改,那么自治事务调用的过程是否能看到自治事务的修改呢:
SQL> TRUNCATE TABLE T_AUTO_TRANS;
表被截断。
SQL> CREATE OR REPLACE PROCEDURE P_AUTO_TRANS AS
2 PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIN
4 INSERT INTO T_AUTO_TRANS VALUES (1, 'TEST');
5 INSERT INTO T_AUTO_TRANS VALUES (2, 'TEST');
6 FOR I IN (SELECT COUNT(*) CNT FROM T_AUTO_TRANS) LOOP
7 DBMS_OUTPUT.PUT_LINE('P_AUTO_TRANS:' || I.CNT);
8 END LOOP;
9 P_TEST;
10 P_TEST_AUTO;
11 COMMIT;
12 END;
13 /
过程已创建。
SQL> INSERT INTO T_AUTO_TRANS VALUES (1, 'TEST');
已创建 1 行。
SQL> EXEC P_AUTO_TRANS
P_AUTO_TRANS:2
P_TEST:3
P_TEST_AUTO:1
PL/SQL 过程已成功完成。
建立一个自治事务,分别调用一个普通过程和一个声明了自治事务的过程,结果可以看到,自治事务调用普通过程,可以看到自治事务所进行的修改,而对于自治事务调用的自治事务过程,是看不到自治事务所进行的修改的。
从这一点看,自治事务更像是在单独的会话中执行,它的事务状态不会影响当前的事务,它也不会看到当前事务没有提交的修改。











