小议Oracle 11g的自治事务(三)
2008-08-09 12:42:42 来源:WEB开发网在第二个会话仍然执行上面的查询:
SQL2>SELECTSID,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视图,检查产生锁的会话:
SQL2>SELECTSID,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行。
SQL2>COLOBJECT_NAMEFORMATA30
SQL2>SELECTOWNER,OBJECT_NAME,OBJECT_TYPE
2FROMDBA_OBJECTS
3WHEREOBJECT_ID=57448;
OWNEROBJECT_NAMEOBJECT_TYPE
-----------------------------------------------------------------------
YANGTKT_AUTO_TRANSTABLE
根据上面两个查询可以看到,自治事务仍然和主事务处于同一个事务之中,为了更好的说明问题,在执行P_AUTO过程先,对T_AUTO_TRANS插入一条数据:
SQL>INSERTINTOT_AUTO_TRANSVALUES(1,'TEST');
已创建 1 行。
SQL>EXECP_AUTO
PL/SQL 过程已成功完成。
在P_AUTO的执行过程中,再次查询V$LOCK:
SQL2>SELECTSID,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的会话同时对应两个事务。因此上文所说的自治事务更像是在单独的会话中执行只是一个比喻,实际上自治事务仍然和主事务处于同一个会话中。
更多精彩
赞助商链接