数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

小议Oracle11g的自治事务(三)


发布日期:2021年03月19日
 
小议Oracle11g的自治事务(三)

上一篇文章提到了自治事务更像是在单独的会话中执行它的事务状态不会影响当前的事务它也不会看到当前事务没有提交的修改

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

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为的会话同时对应两个事务因此上文所说的自治事务更像是在单独的会话中执行只是一个比喻实际上自治事务仍然和主事务处于同一个会话中

上一篇:ORACLE索引提高效率

下一篇:sql存储过程分页