大家都知道TM锁共有6种模式,最常见的是3(插入,更新,删除);4(创建索引时);5(部分DDL操作如:删除列)等等,这些锁比较容易看到,不再详述实验经过.有些操作速度过块,如:Truncate和Drop等.这时不容易看到锁的状态,下面我做了个小实验来看清楚这些速度较快的命令持有什么样的锁. 例如:Truncate和Drop
5m C4ea0CWs!bwg0
xD5| F3C2W/}!Nu7V0
因为命令执行速度快,只有靠脚本来快速观察.如下:
*d.C4de
w6|0
create or replace procedure my_cursor is
ITPUB个人空间']1B#K+L-As @K*_
cursor aa is select lmode from v$lock where type='TM' and sid=您的会话SID;
ITPUB个人空间)o2@,rzp s%k]
x number(3):=9;
ITPUB个人空间sm8c+X&XI
begin
lI3Tc^fc8WR0
for i in 1..3000 loop
oF*@"T
i%e1G0
open aa;
ITPUB个人空间+\3`)pA!XV}}km I
fetch aa into x;
ITPUB个人空间7]r]4Hj$fT
dbms_output.put_line(i||'-'||x);
ITPUB个人空间.C e,v4V SLS_
close aa;
DGysz
k?0
x:=9;
ITPUB个人空间Uw'X)s-T-A#x.AV$e4?
end loop;
ITPUB个人空间G3[KQ%}(Q/^b7| `
end;
8AbI0hS`3M&y8l0
/
*z&W(i
f.[!Zi(N0
**如果X为空的话,下次抓取值不变,所以每次抓取结束后为X附上一个锁中不可能出现的值9;
ITPUB个人空间tP2D` ?"~8fr
ITPUB个人空间[$JSa$~
步一:脚本显示内容过多,会造成显示缓冲区溢出,先把缓冲区设大点;
ITPUB个人空间1[Zn8XI%HN
SQL> set serveroutput on size 100000;
ITPUB个人空间"~S4x)^ D
ITPUB个人空间$| s(s|7SY's^8t
步二:为了更清楚的观察,把结果输送到文件中来查看结果;
ITPUB个人空间qN ?i^_'T5H+L
SQL> spool e:\oracle\aa.txt
ITPUB个人空间2W3^]%t L$B"fd
h?&n1N#u|RK`(ed/}0
步三:执行脚本
)|uXd2Y+S\N0
SQL> exec my_cursor;
ITPUB个人空间0p&Y+Q1h,o
JR lZ
ITPUB个人空间G#jH)p5|N
步四:在另一个会话中去Truncate表
ITPUB个人空间:s]i9v-bx_0B
SQL> truncate table jj_2;
ITPUB个人空间o
k;j'bJ+w
ITPUB个人空间|&XD p"W
表被截断。
a$\!\(kBL%t k eXt(J)F0
----等待第一个会话中的执行完毕----
%y ul3G!g0
步五:把执行结果输送到文件中
ITPUB个人空间(m/p
Ph;B
SQL> spool off;
~-l:F9xx&U0
ITPUB个人空间xY%_4p-C
查看aa.txt 发现 循环次数 锁状态
E$Ud`4N!eF0
--------------- -------------
1HM0rw9P;fw0
1--205 显示为9 无
ITPUB个人空间:@"d5jN;D5^b
206--375 显示为6 传说中的6-X锁
ITPUB个人空间)\!N$[6HR+Kv\
376--结束 一直为9 6 锁已经释放
Lyk'SuJ0
ITPUB个人空间hCb+|:`+kV
*****以上结果我是在10G中做的实验,同样的我又在9i中试了试,发现略有不同*****
ITPUB个人空间3XV-^/o9`
Jv3}
结果如下:
\,F,z!c u i#@0
1--93 显示为9
ITPUB个人空间9L9GgZ)K*p,BW
94--126 显示为6
'GOK(}
z$Av!o0
127--217 显示为2
/s NNU'A0
218--249 显示为3
ITPUB个人空间4N|6kQ#m&b
250--266 显示为6
ITPUB个人空间 o(a\| E Z!E$J"zv
267--结束 一直为9
ITPUB个人空间] V.yCk
ITPUB个人空间J5u'uC"]G;C^;G;s
小结:在10G中只加了6锁,而9i中是236混杂出现,看来10G的截断操作比9i要简单明了,从算法上进步了不少哟~~ !^_^!
-r,N,|H~+]J*O0
9{8` vvcz6_0
另附: drop table 在10G中 为 6锁,9i中是6 3 混合
'k+Q*B"aO"U0XG0
create table 在10G中 为 3锁,
ITPUB个人空间m&AP_j(r8r
create index 在10G中 为 4锁,表共享锁,根据兼容矩阵表示,4号锁和4号锁是相兼容的,但是我同时开两个会话创建索引,还是有等待,发现是library cache lock在等待。因为创建索引时,会在表上加独占的library cache lock。
Zi*k.v0GL$D0
create index on line 在10G中 为 2,4 锁 其中2锁时间较长。2锁只和6锁不兼容,其他都兼容。其中4锁时间较短,只占41次循环。证明连机创建索引对DML操作影响不大,处
cUQ4k0XR SI,Di0
了41次 4锁之外,大部分时间是可以执行DML的.
5dTL sGup@UF
?fk0
ITPUB个人空间
jr6UFWg"qm d
其他执行速度比较快的操作,查看锁步骤类似,可以用上例一样的方式实验...TX锁相关事务,放到后面回滚段相关章节再发...