小议Oracle 11g的自治事务(四)
上一篇文章描述了自治事务实际上仍然是与主事务同处于一个会话中,根据这个结论以及自治事务的特点,可以确定,主事务和自治事务拥有不同的事务上下文环境,但是它们共享会话的上下文环境。
由于自治事务的提交或回滚不会影响到调用自治事务的主事务,因此主事务和自治事务必然是彼此独立的事务,二者之间也不可能有任何事务级的上下文继承关系。
但是由于主事务和自治事务同属于一个会话,因此二者具有相同的会话上下文环境,比如在包变量上,二者就可以看到对方对变量进行的修改:
SQLCREATEORREPLACEPACKAGEPA_TESTAS 2G_NUMNUMBER:=0; 3END; 4/
程序包已创建。
SQLCREATEORREPLACEPROCEDUREP_AUTOAS 2PRAGMAAUTONOMOUS_TRANSACTION; 3BEGIN 4INSERTINTOT_AUTO_TRANSVALUES(1,‘TEST‘); 5PA_TEST.G_NUM:=PA_TEST.G_NUM+1; 6DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM); 7COMMIT; 8END; 9/
过程已创建。
下面分别在主事务和自治事务中修改包中变量的值:
SQLSETSERVEROUTON SQLEXECPA_TEST.G_NUM:=PA_TEST.G_NUM+1;
PL/SQL 过程已成功完成。
SQLEXECDBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM);
1
PL/SQL 过程已成功完成。
SQLEXECP_AUTO
2
PL/SQL 过程已成功完成。
SQLEXECP_AUTO
3
PL/SQL 过程已成功完成。
SQLEXECDBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM);
4
PL/SQL 过程已成功完成。
SQLEXECPA_TEST.G_NUM:=PA_TEST.G_NUM+1;
PL/SQL 过程已成功完成。
SQLEXECDBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM);
5
PL/SQL 过程已成功完成。
SQLEXECP_AUTO
6
PL/SQL 过程已成功完成。
SQLCONNYANGTK/YANGTK@YTK102已连接。 SQLSETSERVEROUTON SQLEXECDBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM);
PL/SQL 过程已成功完成。
可以看到直到会话退出,包中的变量才重新初始化,在此之前自治事务和主事务可以同时看到彼此对变量的修改。
| 广告合作:400-664-0084 全国热线:400-664-0084 Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号 珠峰网 版权所有 All Rights Reserved
|