发表于: 2008.08.03 23:22
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/468031
---------------------------------------------------------------
这两天看了11g的CONCEPT文档的事务部分,发现自治事务还有一些以前没有注意到的地方,这里简单总结一下。
描述自治事务与主事务在事务和会话级的关系。
小议自治事务(一):http://yangtingkun.itpub.net/post/468/467765
小议自治事务(二):http://yangtingkun.itpub.net/post/468/467840
小议自治事务(三):http://yangtingkun.itpub.net/post/468/467933
上一篇文章描述了自治事务实际上仍然是与主事务同处于一个会话中,根据这个结论以及自治事务的特点,可以确定,主事务和自治事务拥有不同的事务上下文环境,但是它们共享会话的上下文环境。
由于自治事务的提交或回滚不会影响到调用自治事务的主事务,因此主事务和自治事务必然是彼此独立的事务,二者之间也不可能有任何事务级的上下文继承关系。
但是由于主事务和自治事务同属于一个会话,因此二者具有相同的会话上下文环境,比如在包变量上,二者就可以看到对方对变量进行的修改:
SQL> CREATE OR REPLACE PACKAGE PA_TEST AS
2 G_NUM NUMBER := 0;
3 END;
4 /
程序包已创建。
SQL> CREATE OR REPLACE PROCEDURE P_AUTO AS
2 PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIN
4 INSERT INTO T_AUTO_TRANS VALUES (1, 'TEST');
5 PA_TEST.G_NUM := PA_TEST.G_NUM + 1;
6 DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM);
7 COMMIT;
8 END;
9 /
过程已创建。
下面分别在主事务和自治事务中修改包中变量的值:
SQL> SET SERVEROUT ON
SQL> EXEC PA_TEST.G_NUM := PA_TEST.G_NUM + 1;
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM);
1
PL/SQL 过程已成功完成。
SQL> EXEC P_AUTO
2
PL/SQL 过程已成功完成。
SQL> EXEC P_AUTO
3
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM);
3
PL/SQL 过程已成功完成。
SQL> EXEC PA_TEST.G_NUM := PA_TEST.G_NUM + 1;
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM);
4
PL/SQL 过程已成功完成。
SQL> EXEC P_AUTO
5
PL/SQL 过程已成功完成。
SQL> CONN YANGTK/YANGTK@YTK102已连接。
SQL> SET SERVEROUT ON
SQL> EXEC DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM);
0
PL/SQL 过程已成功完成。
可以看到直到会话退出,包中的变量才重新初始化,在此之前自治事务和主事务可以同时看到彼此对变量的修改。











