当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
Oracle认证考试辅导:小议Oracle 11g的自治事务(三)
发布时间:2010/3/24 19:58:32 来源:城市学习网 编辑:admin

  小议Oracle 11g的自治事务(三)
  上一篇文章提到了,自治事务更像是在单独的会话中执行,它的事务状态不会影响当前的事务,它也不会看到当前事务没有提交的修改。
  那么自治事务是否和推测的一样,是由另一个会话执行的操作呢,下面通过几个例子来验证这一点:
  SQLTRUNCATETABLET_AUTO_TRANS;
  表被截断。
  SQLCREATEORREPLACEPROCEDUREP_AUTOAS 2PRAGMAAUTONOMOUS_TRANSACTION; 3BEGIN 4INSERTINTOT_AUTO_TRANSVALUES(2,‘TEST‘); 5DBMS_LOCK.SLEEP(10); 6COMMIT; 7END; 8/
  过程已创建。
  SQLSELECTSIDFROMV$MYSTATWHEREROWNUM=1; SID ---------- 143
  在另外一个会话登陆,检查当前系统中会话数量:
  SQLCONN/ASSYSDBA已连接。 SQLSETSQLP‘SQL2‘ SQL2SELECTSID,USERNAME,STATUSFROMV$SESSION; SIDUSERNAMESTATUS ------------------------------------------------ 137ACTIVE 143YANGTKINACTIVE 145ACTIVE 147ACTIVE 149ACTIVE 154SYSACTIVE 156ACTIVE 157ACTIVE 160ACTIVE 161ACTIVE 162ACTIVE 163ACTIVE 164ACTIVE 165ACTIVE 166ACTIVE 167ACTIVE 168ACTIVE 169ACTIVE 170ACTIVE
  已选择19行。
  下面执行P_AUTO过程,这个过程会等待10秒的时间:
  SQLEXECP_AUTO
  在第二个会话仍然执行上面的查询:
  SQL2SELECTSID,USERNAME,STATUSFROMV$SESSION; SIDUSERNAMESTATUS ------------------------------------------------ 143YANGTKACTIVE 145ACTIVE 147ACTIVE 149ACTIVE 154SYSACTIVE 156ACTIVE 157ACTIVE 160ACTIVE 161ACTIVE 162ACTIVE 163ACTIVE 164ACTIVE 165ACTIVE 166ACTIVE 167ACTIVE 168ACTIVE 169ACTIVE 170ACTIVE
  已选择18行。
  查询完成后,会话1的过程才执行完成:
  PL/SQL 过程已成功完成。
  从这一点上看,没有看到自治事务产生额外的会话。下面再次执行P_AUTO过程,并在过程的执行过程中查询V$LOCK视图,检查产生锁的会话:
  SQL2SELECTSID,TYPE,ID1,ID2,LMODE,REQUEST,CTIME 2FROMV$LOCK; SIDTYID1ID2LMODEREQUESTCTIME -------------------------------------------------------------- 165XR40100 165CF002010333 167PW103010320 165RS2512010330 166RT106010330 167MR104010324 167MR204010324 167MR304010324 167MR504010324 167MR604010324 167MR704010324 167MR804010324 167MR20104010324 164TS313010309 143TM574480303 143TX1966215748603
  已选择16行。
  SQL2COLOBJECT_NAMEFORMATA30 SQL2SELECTOWNER,OBJECT_NAME,OBJECT_TYPE 2FROMDBA_OBJECTS 3WHEREOBJECT_ID=57448; OWNEROBJECT_NAMEOBJECT_TYPE ----------------------------------------------------------------------- YANGTKT_AUTO_TRANSTABLE
  根据上面两个查询可以看到,自治事务仍然和主事务处于同一个事务之中,为了更好的说明问题,在执行P_AUTO过程先,对T_AUTO_TRANS插入一条数据:
  SQLINSERTINTOT_AUTO_TRANSVALUES(1,‘TEST‘);
  已创建 1 行。
  SQLEXECP_AUTO
  PL/SQL 过程已成功完成。
  在P_AUTO的执行过程中,再次查询V$LOCK:
  SQL2SELECTSID,TYPE,ID1,ID2,LMODE,REQUEST,CTIME 2FROMV$LOCK; SIDTYID1ID2LMODEREQUESTCTIME -------------------------------------------------------------- 165XR40100 165CF002010643 167PW103010630 165RS2512010640 166RT106010640 167MR104010634 167MR204010634 167MR304010634 167MR504010634 167MR604010634 167MR704010634 167MR804010634 167MR20104010634 164TS313010619 143TM5744803010 143TM574480307 143TX26214645286010 143TX5898585879607
  已选择18行。
  这里可以清楚的看到,SID为143的会话同时对应两个事务。因此上文所说的自治事务更像是在单独的会话中执行只是一个比喻,实际上自治事务仍然和主事务处于同一个会话中。

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved