小议Oracle 11g的自治事务(一) 小议Oracle 11g的自治事务(四)
小议Oracle 11g的自治事务(二) 小议Oracle 11g的自治事务(五)
小议Oracle 11g的自治事务(三) 小议Oracle 11g的自治事务(六)
上一篇文章描述了自治事务实际上仍然是与主事务同处于一个会话中,根据这个结论以及自治事务的特点,可以确定,主事务和自治事务拥有不同的事务上下文环境,但是它们共享会话的上下文环境。
由于自治事务的提交或回滚不会影响到调用自治事务的主事务,因此主事务和自治事务必然是彼此独立的事务,二者之间也不可能有任何事务级的上下文继承关系。
但是由于主事务和自治事务同属于一个会话,因此二者具有相同的会话上下文环境,比如在包变量上,二者就可以看到对方对变量进行的修改:
| 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 过程已成功完成。
可以看到直到会话退出,包中的变量才重新初始化,在此之前自治事务和主事务可以同时看到彼此对变量的修改。

