分类:
2008-10-15 16:26:25
由于自治事务的提交或回滚不会影响到调用自治事务的主事务,因此主事务和自治事务必然是彼此独立的事务,二者之间也不可能有任何事务级的上下文继承关系。
但是由于主事务和自治事务同属于一个会话,因此二者具有相同的会话上下文环境,比如在包变量上,二者就可以看到对方对变量进行的修改:
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); |
4
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); |
5
PL/SQL 过程已成功完成。
SQL> EXEC P_AUTO |
6
PL/SQL 过程已成功完成。
SQL> CONN YANGTK/YANGTK@YTK102已连接。 SQL> SET SERVEROUT ON SQL> EXEC DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM); |
PL/SQL 过程已成功完成。
可以看到直到会话退出,包中的变量才重新初始化,在此之前自治事务和主事务可以同时看到彼此对变量的修改。