[ 登录 ][ 注册 ] 天极传媒: 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
您现在的位置: IT专家网 > 数据库子站 > 数据库技巧

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

作者: 杨廷琨,  出处:blog, 责任编辑: 王晓晨, 
2008-08-08 08:20
  由于自治事务的提交或回滚不会影响到调用自治事务的主事务,因此主事务和自治事务必然是彼此独立的事务,二者之间也不可能有任何事务级的上下文继承关系。

 小议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 过程已成功完成。

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

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。

邮件订阅