小议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
|