转:http://yangtingkun.itpub.net
这两天看了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 ASITPUB个人空间3xi e%b+N^ f
2 PRAGMA AUTONOMOUS_TRANSACTION;ITPUB个人空间M%E S_1L;K
3 BEGINITPUB个人空间tG6{g8`8?\
4 INSERT INTO T_AUTO_TRANS VALUES (2, 'TEST');
LP9q/I,na,x,u11269677 5 DBMS_LOCK.SLEEP(10);ITPUB个人空间RO W%wG3V$R
6 COMMIT;
an!OKF^0M*p"G11269677 7 END;ITPUB个人空间z4V*y Z0T9m
8 /
过程已创建。
SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1;
SID
Z,j,D"d2_-U:szs11269677----------ITPUB个人空间Yf U$t}B*a
143
在另外一个会话登陆,检查当前系统中会话数量:
SQL> CONN / AS SYSDBAITPUB个人空间{U3K0E9JV+Rre
已连接。
#N|f q&to ]11269677SQL> SET SQLP 'SQL2> 'ITPUB个人空间2}z;M[ z#zh
SQL2> SELECT SID, USERNAME, STATUS FROM V$SESSION;
SID USERNAME STATUS
3qy!?t}?7S x4`4[11269677---------- ------------------------------ --------
~$T-k#{:q!ERY11269677 137 ACTIVE
N%|:P"]v5qV`^11269677 143 YANGTK INACTIVE
-f-P1q,tO8Vr4n3~)g11269677 145 ACTIVEITPUB个人空间:Ii&`M X*E
147 ACTIVE
y?q[*g I0lt11269677 149 ACTIVE
qIba(N11269677 154 SYS ACTIVE
c7xw9\jn C5ei11269677 156 ACTIVE
l*]$kH5o G11269677 157 ACTIVE
2zBqd[11269677 160 ACTIVEITPUB个人空间DM g;Ud/V-MG
161 ACTIVEITPUB个人空间*} q3vn7W(k |P
162 ACTIVEITPUB个人空间{y @w.^D4Y*V+N
163 ACTIVE
WGr5b$tGY!N11269677 164 ACTIVE
im R$@7_t} P3`11269677 165 ACTIVEITPUB个人空间wr}O{;tM
166 ACTIVE
+B l Xp0]iDD11269677 167 ACTIVE
W7x.Gi dc3f ^11269677 168 ACTIVEITPUB个人空间/K0J$|4`*d`$g w
169 ACTIVE
#fh PVd.e'g11269677 170 ACTIVE
已选择19行。
下面执行P_AUTO过程,这个过程会等待10秒的时间:
SQL> EXEC P_AUTO
在第二个会话仍然执行上面的查询:
SQL2> SELECT SID, USERNAME, STATUS FROM V$SESSION;
SID USERNAME STATUSITPUB个人空间,B#t O@L On
---------- ------------------------------ --------
EJ"t6dP11269677 143 YANGTK ACTIVE
f;qNeZ-\d11269677 145 ACTIVE
qLelMn"\u11269677 147 ACTIVE
@.~'T/q|Ca"pU3`11269677 149 ACTIVE
%Bz1Ph\W11269677 154 SYS ACTIVEITPUB个人空间(e-^uX7u&pg]
156 ACTIVE
7S$TFZb"Z11269677 157 ACTIVEITPUB个人空间3l h)`ga*Pla?s
160 ACTIVEITPUB个人空间Bp Bx']C7Z?M
161 ACTIVEITPUB个人空间b;Sq Uj%^^ j K;L
162 ACTIVEITPUB个人空间4c"q%xee T$qt
163 ACTIVEITPUB个人空间S+["zN0K
164 ACTIVEITPUB个人空间 WL:Z-h6DGS$q
165 ACTIVEITPUB个人空间 _;oo],?WT
166 ACTIVE
7o pCk4bp$d S m|11269677 167 ACTIVE
1K j K}fr+r11269677 168 ACTIVE
#{)v)v }wF11269677 169 ACTIVEITPUB个人空间 `0gse.a eY2j
170 ACTIVE
已选择18行。
查询完成后,会话1的过程才执行完成:
ITPUB个人空间%a1_QjxM9mj
PL/SQL过程已成功完成。
从这一点上看,没有看到自治事务产生额外的会话。下面再次执行P_AUTO过程,并在过程的执行过程中查询V$LOCK视图,检查产生锁的会话:
SQL2> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIMEITPUB个人空间-m4Rsq]
2 FROM V$LOCK;
SID TY ID1 ID2 LMODE REQUEST CTIMEITPUB个人空间&h(S1{7P+vta Q
---------- -- ---------- ---------- ---------- ---------- ----------ITPUB个人空间+f|].p4ap*b7B&W3mK/S2E
165 XR 4 0 1 0 0ITPUB个人空间$o$H/n@qi9| U B8[-Wt
165 CF 0 0 2 0 10333ITPUB个人空间 I;JOM q
167 PW 1 0 3 0 10320ITPUB个人空间n0H#~*?$@p
165 RS 25 1 2 0 10330ITPUB个人空间lnZu3ie-ij
166 RT 1 0 6 0 10330ITPUB个人空间9D){ d3~];Y1zj/F`
167 MR 1 0 4 0 10324
b9nARc)tXv11269677 167 MR 2 0 4 0 10324ITPUB个人空间"UgcP*PWj
167 MR 3 0 4 0 10324ITPUB个人空间 E\0yrQ;J"@%jN)[
167 MR 5 0 4 0 10324ITPUB个人空间 w3[%z3f4P d}6M
167 MR 6 0 4 0 10324
oC6z;L5c@/@-E%Vi)b c11269677 167 MR 7 0 4 0 10324
7T.Ye#B!o;U&T11269677 167 MR 8 0 4 0 10324
!Q pYx0XS'P%e11269677 167 MR 201 0 4 0 10324ITPUB个人空间&Q:n |7I2^#~)[/He
164 TS 3 1 3 0 10309ITPUB个人空间#S3g;^_c s%d4z7Db
143 TM 57448 0 3 0 3
+N*|p!N_ v11269677 143 TX 196621 5748 6 0 3
已选择16行。
SQL2>COLOBJECT_NAME FORMAT A30
` q#Pz6jb mG ^ Q c11269677SQL2> SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
F_@[e*b11269677 2 FROM DBA_OBJECTSITPUB个人空间6H2](A+Pp-F I
3 WHERE OBJECT_ID = 57448;
OWNER OBJECT_NAME OBJECT_TYPEITPUB个人空间:AZD"c"JAH4ez9u
------------------------------ ------------------------------ -----------ITPUB个人空间%?CK6JX[ c
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
4x2b&d1Z-l.k+R0BI:}11269677 2 FROM V$LOCK;
SID TY ID1 ID2 LMODE REQUEST CTIMEITPUB个人空间;_2qpWb#Qt;Q T
---------- -- ---------- ---------- ---------- ---------- ----------ITPUB个人空间,n-m{t5F$a"Y
165 XR 4 0 1 0 0
0q rY-Oi8OcV6H8x11269677 165 CF 0 0 2 0 10643
:D%F3LIp/E]11269677 167 PW 1 0 3 0 10630ITPUB个人空间Gw:iwJQ0[
165 RS 25 1 2 0 10640
tL@*WFlp11269677 166 RT 1 0 6 0 10640
G!m:Wr.R ZB11269677 167 MR 1 0 4 0 10634
-ya$e4a }5B Le7?11269677 167 MR 2 0 4 0 10634
K-ebEod T_11269677 167 MR 3 0 4 0 10634
1b\@3T h-Z%H)qzZB11269677 167 MR 5 0 4 0 10634ITPUB个人空间+Y i%vL{'gO
167 MR 6 0 4 0 10634ITPUB个人空间([m"]nQP ^ n
167 MR 7 0 4 0 10634
!^y^(Tc3~j^} @Dwn11269677 167 MR 8 0 4 0 10634ITPUB个人空间7la2])fW
167 MR 201 0 4 0 10634ITPUB个人空间+k"CZ:{f#r
164 TS 3 1 3 0 10619
5IT,[%~1zf?hc11269677 143 TM 57448 0 3 0 10ITPUB个人空间Rbu6E-W"L
143 TM 57448 0 3 0 7
E6|~7]Ni%JY11269677 143 TX 262146 4528 6 0 10
4]%AmOMV11269677 143 TX 589858 5879 6 0 7
已选择18行。
这里可以清楚的看到,SID为143的会话同时对应两个事务。因此上文所说的自治事务更像是在单独的会话中执行只是一个比喻,实际上自治事务仍然和主事务处于同一个会话中
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11269677/viewspace-613434/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/11269677/viewspace-613434/