大家都知道TM锁共有6种模式,最常见的是3(插入,更新,删除);4(创建索引时);5(部分DDL操作如:删除列)等等,这些锁比较容易看到,不再详述实验经过.有些操作速度过块,如:Truncate和Drop等.这时不容易看到锁的状态,下面我做了个小实验来看清楚这些速度较快的命令持有什么样的锁. 例如:Truncate和Drop
{J-N)c oL]3i0
W#al'w(B0
因为命令执行速度快,只有靠脚本来快速观察.如下:
ITPUB个人空间^ r
M#Io"R P
create or replace procedure my_cursor is
:ty
h;gF8@#gT0
cursor aa is select lmode from v$lock where type='TM' and sid=您的会话SID;
X^` h uZd*g}}%U0
x number(3):=9;
fjs{.\W0
begin
2y`ak$U0
for i in 1..3000 loop
ITPUB个人空间+Bt,w e/{YV ]8F
open aa;
A}'NtJ
\%X0
fetch aa into x;
ITPUB个人空间 U*g[8]$Y$`"yp
dbms_output.put_line(i||'-'||x);
ITPUB个人空间 Z7d5i2~_,M
close aa;
3r-u3XoVWK"S0
x:=9;
ITPUB个人空间;\@JfhI!k
end loop;
ITPUB个人空间u;{#fp2x;Q@1X
end;
ITPUB个人空间7rSP4SS5@u2@8o:Y
/
S8Q[t+mu*m,x0
**如果X为空的话,下次抓取值不变,所以每次抓取结束后为X附上一个锁中不可能出现的值9;
!P$v Q-_5ac)g?%CK0
@d^l0x0
步一:脚本显示内容过多,会造成显示缓冲区溢出,先把缓冲区设大点;
ITPUB个人空间9P,]PT:A"n
SQL> set serveroutput on size 100000;
1z8f n^%G5]V0
ITPUB个人空间
OBG#px4hc
步二:为了更清楚的观察,把结果输送到文件中来查看结果;
ITPUB个人空间~F%PT n8q:Y
SQL> spool e:\oracle\aa.txt
pS,RPl#_)K{0
U
|7V ~ h WK0
步三:执行脚本
H4Lq+_ehWg-e%T0
SQL> exec my_cursor;
ITPUB个人空间9_2y!L
WNjXl
\'A0Q;{ r ]ob4sg;O!N0
步四:在另一个会话中去Truncate表
/vE8Mo4[+l'uO
Z+|0
SQL> truncate table jj_2;
ITPUB个人空间
EYH\b+P:U
ITPUB个人空间u+y&v
C9z
表被截断。
ITPUB个人空间'xv%baB_ rQ
----等待第一个会话中的执行完毕----
Us6u+iK1W3x0
步五:把执行结果输送到文件中
{P!\&t$NA0|6]0
SQL> spool off;
k9fmx0j*f,e6\#f0
[%]/b+AB-X
sl|'@!z.?0
查看aa.txt 发现 循环次数 锁状态
ITPUB个人空间NinB)~
--------------- -------------
:W.Cq-iE"z
kR,Po ]0
1--205 显示为9 无
ITPUB个人空间#E1[%d0x5E"]_I#[dQ
206--375 显示为6 传说中的6-X锁
c_&\4B`9kSS!h0
376--结束 一直为9 6 锁已经释放
ITPUB个人空间C+o~zBtt.T8B
f1~.Z"|DBT0
*****以上结果我是在10G中做的实验,同样的我又在9i中试了试,发现略有不同*****
ITPUB个人空间.e+q ys"V1U|0b{A
结果如下:
k&Ue"Mmk0
1--93 显示为9
ITPUB个人空间Qbo$|S
94--126 显示为6
ITPUB个人空间-P |6A%]of'Z~t
127--217 显示为2
?e ~M$i&~0
218--249 显示为3
3y(Wa+J_3p5j0
250--266 显示为6
ITPUB个人空间m!sF;T3d-i
267--结束 一直为9
ITPUB个人空间#Y_*L*tX;G Tu.x$i
ITPUB个人空间^&ab$Pfm(b
小结:在10G中只加了6锁,而9i中是236混杂出现,看来10G的截断操作比9i要简单明了,从算法上进步了不少哟~~ !^_^!
ITPUB个人空间 vs$Lf`\^t
T4ZE4W8TR0
另附: drop table 在10G中 为 6锁,9i中是6 3 混合
ITPUB个人空间 |-He$MeEa
create table 在10G中 为 3锁,
8{i/r;G"aHb4~d/[0
create index 在10G中 为 4锁,表共享锁,根据兼容矩阵表示,4号锁和4号锁是相兼容的,但是我同时开两个会话创建索引,还是有等待,发现是library cache lock在等待。因为创建索引时,会在表上加独占的library cache lock。
ITPUB个人空间HJ%?-m;j
l+{D_
create index on line 在10G中 为 2,4 锁 其中2锁时间较长。2锁只和6锁不兼容,其他都兼容。其中4锁时间较短,只占41次循环。证明连机创建索引对DML操作影响不大,处
7b@k\Q-u.s0
了41次 4锁之外,大部分时间是可以执行DML的.
(^B1sDSsl5]0
ITPUB个人空间Tc Pd`OD|
其他执行速度比较快的操作,查看锁步骤类似,可以用上例一样的方式实验...TX锁相关事务,放到后面回滚段相关章节再发...