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

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

  那么自治事务是否和推测的一样,是由另一个会话执行的操作呢,下面通过几个例子来验证这一点:  







SQL> truncate TABLE T_AUTO_TRANS; 

  表被截断。






SQL> create OR REPLACE PROCEDURE P_AUTO AS 
  2 PRAGMA AUTONOMOUS_TRANSACTION; 
  3 BEGIN 
  4 insert INTO T_AUTO_TRANS VALUES (2, ’TEST’); 
  5 DBMS_LOCK.SLEEP(10); 
  6 COMMIT; 
  7 END; 
  8 / 

  过程已创建。







SQL> select SID FROM V$MYSTAT where ROWNUM = 1; 
  SID 
  ———- 
  143 


  在另外一个会话登陆,检查当前系统中会话数量: 







SQL> CONN / AS SYSDBA已连接。 
  SQL> SET SQLP ’SQL2> ’ 
  SQL2> select SID, USERNAME, STATUS FROM V$SESSION; 
  SID USERNAME STATUS 
  ———- —————————— ——– 
  137 ACTIVE 
  143 YANGTK INACTIVE 
  145 ACTIVE 
  147 ACTIVE 
  149 ACTIVE 
  154 SYS ACTIVE 
  156 ACTIVE 
  157 ACTIVE 
  160 ACTIVE 
  161 ACTIVE 
  162 ACTIVE 
  163 ACTIVE 
  164 ACTIVE 
  165 ACTIVE 
  166 ACTIVE 
  167 ACTIVE 
  168 ACTIVE 
  169 ACTIVE 
  170 ACTIVE 


  已选择19行。



  下面执行P_AUTO过程,这个过程会等待10秒的时间:







SQL> &#101xec P_AUTO 

  在第二个会话仍然执行上面的查询: 







SQL2> select SID, USERNAME, STATUS FROM V$SESSION; 
  SID USERNAME STATUS 
  ———- —————————— ——– 
  143 YANGTK ACTIVE 
  145 ACTIVE 
  147 ACTIVE 
  149 ACTIVE 
  154 SYS ACTIVE 
  156 ACTIVE 
  157 ACTIVE 
  160 ACTIVE 
  161 ACTIVE 
  162 ACTIVE 
  163 ACTIVE 
  164 ACTIVE 
  165 ACTIVE 
  166 ACTIVE 
  167 ACTIVE 
  168 ACTIVE 
  169 ACTIVE 
  170 ACTIVE 


  已选择18行。


  查询完成后,会话1的过程才执行完成:


  PL/SQL 过程已成功完成。


  从这一点上看,没有看到自治事务产生额外的会话。下面再次执行P_AUTO过程,并在过程的执行过程中查询V$LOCK视图,检查产生锁的会话: 







SQL2> select SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME 
  2 FROM V$LOCK; 
  SID TY ID1 ID2 LMODE REQUEST CTIME 
  ———- — ———- ———- ———- ———- ———- 
  165 XR 4 0 1 0 0 
  165 CF 0 0 2 0 10333 
  167 PW 1 0 3 0 10320 
  165 RS 25 1 2 0 10330 
  166 RT 1 0 6 0 10330 
  167 MR 1 0 4 0 10324 
  167 MR 2 0 4 0 10324 
  167 MR 3 0 4 0 10324 
  167 MR 5 0 4 0 10324 
  167 MR 6 0 4 0 10324 
  167 MR 7 0 4 0 10324 
  167 MR 8 0 4 0 10324 
  167 MR 201 0 4 0 10324 
  164 TS 3 1 3 0 10309 
  143 TM 57448 0 3 0 3 
  143 TX 196621 5748 6 0 3 


  已选择16行。







SQL2> COL OBJECT_NAME FORMAT A30 
  SQL2> select OWNER, OBJECT_NAME, OBJECT_TYPE 
  2 FROM DBA_OBJECTS 
  3 where OBJECT_ID = 57448; 
  OWNER OBJECT_NAME OBJECT_TYPE 
  —————————— —————————— ———– 
  YANGTK T_AUTO_TRANS TABLE 


  根据上面两个查询可以看到,自治事务仍然和主事务处于同一个事务之中,为了更好的说明问题,在执行P_AUTO过程先,对T_AUTO_TRANS插入一条数据:







SQL> insert INTO T_AUTO_TRANS VALUES (1, ’TEST’); 

  已创建 1 行。






SQL> &#101xec P_AUTO 

  PL/SQL 过程已成功完成。


  在P_AUTO的执行过程中,再次查询V$LOCK:






SQL2> select SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME 
  2 FROM V$LOCK; 
  SID TY ID1 ID2 LMODE REQUEST CTIME 
  ———- — ———- ———- ———- ———- ———- 
  165 XR 4 0 1 0 0 
  165 CF 0 0 2 0 10643 
  167 PW 1 0 3 0 10630 
  165 RS 25 1 2 0 10640 
  166 RT 1 0 6 0 10640 
  167 MR 1 0 4 0 10634 
  167 MR 2 0 4 0 10634 
  167 MR 3 0 4 0 10634 
  167 MR 5 0 4 0 10634 
  167 MR 6 0 4 0 10634 
  167 MR 7 0 4 0 10634 
  167 MR 8 0 4 0 10634 
  167 MR 201 0 4 0 10634 
  164 TS 3 1 3 0 10619 
  143 TM 57448 0 3 0 10 
  143 TM 57448 0 3 0 7 
  143 TX 262146 4528 6 0 10 
  143 TX 589858 5879 6 0 7 


  已选择18行。


  这里可以清楚的看到,SID为143的会话同时对应两个事务。因此上文所说的自治事务更像是在单独的会话中执行只是一个比喻,实际上自治事务仍然和主事务处于同一个会话中。

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

相关推荐