小议自治事务(三)

这两天看了11gCONCEPT文档的事务部分,发现自治事务还有一些以前没有注意到的地方,这里简单总结一下。

描述自治事务与会话的关系。

小议自治事务(一):http://yangtingkun.itpub.net/post/468/467765

小议自治事务(二):http://yangtingkun.itpub.net/post/468/467840

 

 

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

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

SQL> TRUNCATE TABLE T_AUTO_TRANS;

表被截断。

SQL> CREATE OR REPLACE PROCEDURE P_AUTO AS
  2   PRAGMA AUTONOMOUS_TRANSACTION;
  3  BEGIN
  4   INSERT INTO T_AUTO_TRANS VALUES (2, 'TEST');
  5   DBMS_LOCK.SLEEP(10);
  6   COMMIT;
  7  END;
  8  /

过程已创建。

SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1;

       SID
----------
       143

在另外一个会话登陆,检查当前系统中会话数量:

SQL> CONN / AS SYSDBA
已连接。
SQL> SET SQLP 'SQL2> '
SQL2> SELECT SID, USERNAME, STATUS FROM V$SESSION;

       SID USERNAME                       STATUS
---------- ------------------------------ --------
       137                                ACTIVE
       143 YANGTK                         INACTIVE
       145                                ACTIVE
       147                                ACTIVE
       149                                ACTIVE
       154 SYS                            ACTIVE
       156                                ACTIVE
       157                                ACTIVE
       160                                ACTIVE
       161                                ACTIVE
       162                                ACTIVE
       163                                ACTIVE
       164                                ACTIVE
       165                                ACTIVE
       166                                ACTIVE
       167                                ACTIVE
       168                                ACTIVE
       169                                ACTIVE
       170                                ACTIVE

已选择19行。

下面执行P_AUTO过程,这个过程会等待10秒的时间:

SQL> EXEC P_AUTO

 在第二个会话仍然执行上面的查询:

SQL2> SELECT SID, USERNAME, STATUS FROM V$SESSION;

       SID USERNAME                       STATUS
---------- ------------------------------ --------
       143 YANGTK                         ACTIVE
       145                                ACTIVE
       147                                ACTIVE
       149                                ACTIVE
       154 SYS                            ACTIVE
       156                                ACTIVE
       157                                ACTIVE
       160                                ACTIVE
       161                                ACTIVE
       162                                ACTIVE
       163                                ACTIVE
       164                                ACTIVE
       165                                ACTIVE
       166                                ACTIVE
       167                                ACTIVE
       168                                ACTIVE
       169                                ACTIVE
       170                                ACTIVE

已选择18行。

查询完成后,会话1的过程才执行完成:


PL/SQL
过程已成功完成。

从这一点上看,没有看到自治事务产生额外的会话。下面再次执行P_AUTO过程,并在过程的执行过程中查询V$LOCK视图,检查产生锁的会话:

SQL2> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME
  2  FROM V$LOCK;

       SID TY        ID1        ID2      LMODE    REQUEST      CTIME
---------- -- ---------- ---------- ---------- ---------- ----------
       165 XR          4          0          1          0          0
       165 CF          0          0          2          0      10333
       167 PW          1          0          3          0      10320
       165 RS         25          1          2          0      10330
       166 RT          1          0          6          0      10330
       167 MR          1          0          4          0      10324
       167 MR          2          0          4          0      10324
       167 MR          3          0          4          0      10324
       167 MR          5          0          4          0      10324
       167 MR          6          0          4          0      10324
       167 MR          7          0          4          0      10324
       167 MR          8          0          4          0      10324
       167 MR        201          0          4          0      10324
       164 TS          3          1          3          0      10309
       143 TM      57448          0          3          0          3
       143 TX     196621       5748          6          0          3

已选择16行。

SQL2> COL OBJECT_NAME FORMAT A30
SQL2> SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
  2  FROM DBA_OBJECTS
  3  WHERE OBJECT_ID = 57448;

OWNER                          OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------ -----------
YANGTK                         T_AUTO_TRANS                   TABLE

根据上面两个查询可以看到,自治事务仍然和主事务处于同一个事务之中,为了更好的说明问题,在执行P_AUTO过程先,对T_AUTO_TRANS插入一条数据:

SQL> INSERT INTO T_AUTO_TRANS VALUES (1, 'TEST');

已创建 1 行。

SQL> EXEC P_AUTO

PL/SQL 过程已成功完成。

P_AUTO的执行过程中,再次查询V$LOCK

SQL2> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME
  2  FROM V$LOCK;

       SID TY        ID1        ID2      LMODE    REQUEST      CTIME
---------- -- ---------- ---------- ---------- ---------- ----------
       165 XR          4          0          1          0          0
       165 CF          0          0          2          0      10643
       167 PW          1          0          3          0      10630
       165 RS         25          1          2          0      10640
       166 RT          1          0          6          0      10640
       167 MR          1          0          4          0      10634
       167 MR          2          0          4          0      10634
       167 MR          3          0          4          0      10634
       167 MR          5          0          4          0      10634
       167 MR          6          0          4          0      10634
       167 MR          7          0          4          0      10634
       167 MR          8          0          4          0      10634
       167 MR        201          0          4          0      10634
       164 TS          3          1          3          0      10619
       143 TM      57448          0          3          0         10
       143 TM      57448          0          3          0          7
       143 TX     262146       4528          6          0         10
       143 TX     589858       5879          6          0          7

已选择18行。

这里可以清楚的看到,SID143的会话同时对应两个事务。因此上文所说的自治事务更像是在单独的会话中执行只是一个比喻,实际上自治事务仍然和主事务处于同一个会话中。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-417489/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-417489/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值