这两天看了11g的CONCEPT文档的事务部分,发现自治事务还有一些以前没有注意到的地方,这里简单总结一下。
描述自治事务与会话的关系。
小议自治事务(一):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行。
这里可以清楚的看到,SID为143的会话同时对应两个事务。因此上文所说的自治事务更像是在单独的会话中执行只是一个比喻,实际上自治事务仍然和主事务处于同一个会话中。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-417489/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-417489/