小议Oracle 11g的自治事务(四)

日期: 2008-08-11 作者:杨廷琨 来源:TechTarget中国 英文

  上一篇文章描述了自治事务实际上仍然是与主事务同处于一个会话中,根据这个结论以及自治事务的特点,可以确定,主事务和自治事务拥有不同的事务上下文环境,但是它们共享会话的上下文环境。


  由于自治事务的提交或回滚不会影响到调用自治事务的主事务,因此主事务和自治事务必然是彼此独立的事务,二者之间也不可能有任何事务级的上下文继承关系。


  但是由于主事务和自治事务同属于一个会话,因此二者具有相同的会话上下文环境,比如在包变量上,二者就可以看到对方对变量进行的修改:






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> &#101xec PA_TEST.G_NUM := PA_TEST.G_NUM + 1; 


  PL/SQL 过程已成功完成。







SQL> &#101xec DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM); 

  1


  PL/SQL 过程已成功完成。 







SQL> &#101xec P_AUTO 



    2


  PL/SQL 过程已成功完成。







SQL> &#101xec P_AUTO 

  3


  PL/SQL 过程已成功完成。 






SQL> &#101xec DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM); 

    4


  PL/SQL 过程已成功完成。






SQL> &#101xec PA_TEST.G_NUM := PA_TEST.G_NUM + 1; 

  PL/SQL 过程已成功完成。  






SQL> &#101xec DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM); 

  5


  PL/SQL 过程已成功完成。







SQL> &#101xec P_AUTO 

  6


  PL/SQL 过程已成功完成。







SQL> CONN YANGTK/YANGTK@YTK102已连接。 
SQL> SET SERVEROUT ON 
SQL> &#101xec DBMS_OUTPUT.PUT_LINE(PA_TEST.G_NUM); 

  PL/SQL 过程已成功完成。


  可以看到直到会话退出,包中的变量才重新初始化,在此之前自治事务和主事务可以同时看到彼此对变量的修改。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐