上一篇文章提到了自治事务更像是在单独的会话中执行它的事务状态不会影响当前的事务它也不会看到当前事务没有提交的修改
那么自治事务是否和推测的一样是由另一个会话执行的操作呢下面通过几个例子来验证这一点
SQL>TRUNCATETABLET_AUTO_TRANS;
表被截断
SQL>CREATEORREPLACEPROCEDUREP_AUTOAS
PRAGMAAUTONOMOUS_TRANSACTION;
BEGIN
INSERTINTOT_AUTO_TRANSVALUES(TEST);
DBMS_LOCKSLEEP();
COMMIT;
END;
/
过程已创建
SQL>SELECTSIDFROMV$MYSTATWHEREROWNUM=;
SID
在另外一个会话登陆检查当前系统中会话数量
SQL>CONN/ASSYSDBA已连接
SQL>SETSQLPSQL>
SQL>SELECTSIDUSERNAMESTATUSFROMV$SESSION;
SIDUSERNAMESTATUS
ACTIVE
YANGTKINACTIVE
ACTIVE
ACTIVE
ACTIVE
SYSACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
已选择行
下面执行P_AUTO过程这个过程会等待秒的时间
SQL>EXECP_AUTO
在第二个会话仍然执行上面的查询
SQL>SELECTSIDUSERNAMESTATUSFROMV$SESSION;
SIDUSERNAMESTATUS
YANGTKACTIVE
ACTIVE
ACTIVE
ACTIVE
SYSACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
ACTIVE
已选择行
查询完成后会话的过程才执行完成
PL/SQL 过程已成功完成
从这一点上看没有看到自治事务产生额外的会话下面再次执行P_AUTO过程并在过程的执行过程中查询V$LOCK视图检查产生锁的会话
SQL>SELECTSIDTYPEIDIDLMODEREQUESTCTIME
FROMV$LOCK;
SIDTYIDIDLMODEREQUESTCTIME
XR
CF
PW
RS
RT
MR
MR
MR
MR
MR
MR
MR
MR
TS
TM
TX
已选择行
SQL>COLOBJECT_NAMEFORMATA
SQL>SELECTOWNEROBJECT_NAMEOBJECT_TYPE
FROMDBA_OBJECTS
WHEREOBJECT_ID=;
OWNEROBJECT_NAMEOBJECT_TYPE
YANGTKT_AUTO_TRANSTABLE
根据上面两个查询可以看到自治事务仍然和主事务处于同一个事务之中为了更好的说明问题在执行P_AUTO过程先对T_AUTO_TRANS插入一条数据
SQL>INSERTINTOT_AUTO_TRANSVALUES(TEST);
已创建 行
SQL>EXECP_AUTO
PL/SQL 过程已成功完成
在P_AUTO的执行过程中再次查询V$LOCK
SQL>SELECTSIDTYPEIDIDLMODEREQUESTCTIME
FROMV$LOCK;
SIDTYIDIDLMODEREQUESTCTIME
XR
CF
PW
RS
RT
MR
MR
MR
MR
MR
MR
MR
MR
TS
TM
TM
TX
TX
已选择行
这里可以清楚的看到SID为的会话同时对应两个事务因此上文所说的自治事务更像是在单独的会话中执行只是一个比喻实际上自治事务仍然和主事务处于同一个会话中