没有必胜的秘籍,没有方程式遵循~~ 要赢~~只有全身心的投入!

晶晶实验三DDL和DML操作都加什么样的TM锁篇

上一篇 / 下一篇  2008-02-16 17:41:50 / 个人分类:晶晶oracle实验系列

查看( 508 ) / 评论( 24 )
大家都知道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
l I3Tc^fc8WR0   for i in 1..3000 loop
oF*@"T i%e1G0     open aa;ITPUB个人空间+\3`)pA!XV}}k m I
    fetch aa into x;ITPUB个人空间7]r]4Hj$fT
    dbms_output.put_line(i||'-'||x);ITPUB个人空间.C e,v4VS LS_
    close aa;
DGysz k?0     x:=9;   ITPUB个人空间Uw'X)s-T-A#x.AV$e4?
  end loop;  ITPUB个人空间G3[KQ%}(Q/^b7|`
end;
8A bI0hS`3M&y8l0 /
*z&W(i f.[!Zi(N0 **如果X为空的话,下次抓取值不变,所以每次抓取结束后为X附上一个锁中不可能出现的值9;ITPUB个人空间tP2D`?"~8fr
ITPUB个人空间[$J Sa$~
步一:脚本显示内容过多,会造成显示缓冲区溢出,先把缓冲区设大点;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.txtITPUB个人空间2W3^]%tL$B"fd

h?&n1N#u|RK`(e d/}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 keXt(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       显示为9ITPUB个人空间9L9GgZ)K*p,BW
                            94--126      显示为6
'GOK(} z$Av!o0                   127--217      显示为2
/s NNU'A0                   218--249      显示为3ITPUB个人空间4N|6kQ#m&b
                  250--266      显示为6ITPUB个人空间o(a\| E Z!E$J"zv
                  267--结束    一直为9ITPUB个人空间] 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&A P_ 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操作影响不大,处
cUQ4k0XRS I,Di0 了41次 4锁之外,大部分时间是可以执行DML的.
5dTL sGup@UF ?fk0 ITPUB个人空间 jr6UFWg"qmd
其他执行速度比较快的操作,查看锁步骤类似,可以用上例一样的方式实验...TX锁相关事务,放到后面回滚段相关章节再发...

TAG:

shiri512003发布于2008-02-16 17:43:09
first
eagle_fan发布于2008-02-16 17:46:46
你可以用10704 trace event,显示更为清楚准确
"N[{y8_oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net1u$vw        SX6~^ b~S,vf
看我以前写的文章:
:wfAo)x*^X
'`IR+uy}O$c:hhttp://www.dbafan.com/blog/?p=49
棉花糖ONE发布于2008-02-16 17:58:02
mm的想法很好
烟囱的个人空间 烟囱 发布于2008-02-16 18:05:49
mm把这每天一课进行下去.9c[:A}3gol`
我等收获不小哦.s6ZoE)N6~p&I
&`'E'R(F+LC
f:d

谢谢!
SingleLove的个人空间 SingleLove 发布于2008-02-16 19:03:35
不错,顶一个
oracle_li发布于2008-02-16 21:17:21
大力支持下MM!
Alienovo的个人空间 Alienovo 发布于2008-02-16 21:19:56
学习一下
sydongsun发布于2008-02-17 09:35:55
内容不错的。
stronghearted的个人空间 stronghearted 发布于2008-02-17 10:51:04
good job.
*a?b8h
ng-bITPUB个人空间
1X&HB9s:Z
思路不错!
oradbHome oradbHome 发布于2008-02-17 19:16:13
附加上 lock mode^Qt,~*?Z6{eDxx
0 - none
Y
@5QH2DH'BITPUB个人空间
1 - null (NULL) B/y)^ A?kP
2 - row-S (SS) STubGg        I^
3 - row-X (SX) oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net3BYh l jzs-Mw
4 - share (S)
G_8A,bZ3yITPUB个人空间5 - S/Row-X (SSX) ,U.K?+]@c.x1}
6 - exclusive (X) 2_`?9f@;rdd
就不用在去查数据字典了^_^
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-17 19:48:06
在各种文档中,对于这6种模式的锁,英文称呼个不相同,我把他总结了一下,如下:space.itpub.net(D,q {0I#B"j
0 - none ITPUB个人空间[~fMo ]"}5B/g
? o

1 - null (NULL) |EqOS4YG
2 - row-S (SS) 也简称rs锁 oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net"G6J$XvqR%f8U
3 - row-X (SX)    rxITPUB个人空间}6D%wS3~:TS
4 - share (S)            ITPUB个人空间6Z7s$wM Yr
Ei:Q z

5 - S/Row-X (SSX)    srx
`v S
~0TRYspace.itpub.net
6 - exclusive (X)_-V p8Kjj@

t4M*Z[;K q*D!nITPUB个人空间其中2,3锁属于意向锁,关于这一点可以参考 萨师煊 和 王珊 的<数据库系统概论>这本书的并发控制那一张.ITPUB个人空间2vZq,X2[+P
H:~,XS


I
QTR&KJq7]Voracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
[ 本帖最后由 晶晶小妹 于 2008-2-17 19:59 编辑 ]
蚊子窝 foxmile 发布于2008-02-17 19:59:14
看了一下,锁的一些概念还不太明白。
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-17 20:03:20

QUOTE:

原帖由 foxmile 于 2008-2-17 19:59 发表 ITPUB个人空间8N
C#Ac%Gl)] hm

看了一下,锁的一些概念还不太明白。
;p9g)~?/l`V;gQspace.itpub.netITPUB个人空间T/Row7|.r
哪些不明白?? 
蚊子窝 foxmile 发布于2008-02-17 20:26:26
什么情况下会死锁。如何找到引发死锁的应用。
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-18 12:45:23

QUOTE:

原帖由 foxmile 于 2008-2-17 20:26 发表 oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net5\b+j8EY$Rg
什么情况下会死锁。如何找到引发死锁的应用。
g Y#b9N-O$Z%_t

B)^`#N-[9o%X;is
U.|
死锁发生之后,通常有一个会话会被中断,在告警日志里面会记录一些信息.
蚊子窝 foxmile 发布于2008-02-18 12:50:35
恩。了解。多谢!
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-18 13:04:22

QUOTE:

原帖由 foxmile 于 2008-2-17 20:26 发表
IS2aL%F什么情况下会死锁。如何找到引发死锁的应用。
.~FoH;r
W8^oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net'W[X'_"q4i+g
做了一个简单的实验:Q$[WP+uC8v |!E
会话10:
-`2T*w? s ar5Isid=10 pid=11> update aa_1 set name=lower(name) where id=1;
UB6HA,Wqoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net已更新 1 行。
qIdf(n:xg"xspace.itpub.netsid=10 pid=11> update aa_1 set name=lower(name) where id=2;`;O~2d8r-R8[9s];r

N5ffC-gr"P(gl会话121mx
Y/wwL+QI6i@

sid=12 pid=12> update aa_1 set name=lower(name) where id=2;ITPUB个人空间-x?3F
Q#B/x;W'GH.f*}

已更新 1 行。-J4K@$A        yrf
sid=12 pid=12> update aa_1 set name=lower(name) where id=1;
-h5W(cLH]#oD_4Z+Q6Zvg.g|
H N9qm9|3j

会话10的命令先发布,因此,稍等之后,会话12会报出如下错误:
{)Q!vMUoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netupdate aa_1 set name=lower(name) where id=1(^)x&v(u:h
       *
^8j7cB;nr6i第 1 行出现错误:
#P5X4k y.W8n_ ?UITPUB个人空间ORA-00060: 等待资源时检测到死锁ITPUB个人空间(tl~
R/~z        _+y~F
K

space.itpub.net(n5J        @d\,R
这时,查找告警日志,可以发现如下死锁信息:
N%w SH:@)X        h m-[space.itpub.netMon Feb 18 12:43:51 2008
)@)gL4r@&\9^voracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netORA-000060: Deadlock detected. More info in file e:\oracle\admin\mytwo\udump\mytwo_ora_348.trc.
3N"H        g[O        M U7v
,|m"Za*Cfspace.itpub.net按照指示,查看跟踪文件:space.itpub.neta:X+X
W K

                       ---------Blocker(s)--------  ---------Waiter(s)---------,f0s0Cm/`!w{        r X!h
Resource Name          process session holds waits  process session holds waits
K| k2MJX}TX-0003000b-000008e0        12      12     X             11      10           X
.wWs_7\(Le-iTX-00040009-00000991        11      10     X             12      12           X!e1H        Iq5V+qD
session 12: DID 0001-000C-00000002        session 10: DID 0001-000B-00000002}fB)i        U S [
session 10: DID 0001-000B-00000002        session 12: DID 0001-000C-00000002
&iEm \ [oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netRows waited on:
y@M&b!k iT1~u        USession 10: obj - rowid = 000019ED - AAAB7zAAFAAAV02AAAoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netW)YiN#d$b)y!]2\b
  (dictionary objn - 6637, file - 5, block - 89398, slot - 0)
_9k W2caSession 12: obj - rowid = 000019ED - AAAB7zAAFAAAV00AAAITPUB个人空间.d*aB7n]#J9oi
  (dictionary objn - 6637, file - 5, block - 89396, slot - 0)6em srx0{+MP
Information on the OTHER waiting sessions:
l4vV%wIspace.itpub.netSession 10:
W!H/Sm!Fw Noracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net  pid=11 serial=71 audsid=5634 user: 30/SCOTT
C|5jU8z/y/M6Woracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net  O/S info: user: JB\JJBOBO1, term: JB, ospid: 464:440, machine: WORKGROUP\JBITPUB个人空间i~Un b?%\h8IK
            program: sqlplus.exef5MF9Zjub | UN
  application name: SQL*Plus, hash value=3669949024space.itpub.net5WY2Z8yL+L{
  Current SQL Statement:
'qR,h"s&sI:Onspace.itpub.net  update aa_1 set name=lower(name) where id=2
l q`N,o        U#OF$`fspace.itpub.netEnd of information on OTHER waiting sessions.ITPUB个人空间R;}L"wod
===================================================
G^Q{4~GA?]space.itpub.net下面还有PROCESS STATE,不再列出。
l ga~&Xg|)\3B3XHp1J
根据跟踪文件中的信息,应该足以找到死锁发生的位置。
Hero--008的个人空间 Hero--008 发布于2008-02-18 13:29:58
如此学习态度,还有什么东西学不会的呢~~榜样阿!看齐~~
蚊子窝 foxmile 发布于2008-02-19 14:09:07

QUOTE:

原帖由 晶晶小妹 于 2008-2-18 13:04 发表 ITPUB个人空间-Jh"b%I(KkWub}
ITPUB个人空间1v|4dweZ{
space.itpub.net4fjM%L(wP#Q2o
做了一个简单的实验:
kt}|+mt8\,LtgdITPUB个人空间会话10:_!C1q;s
rb

sid=10 pid=11> update aa_1 set name=lower(name) where id=1;
3Zz5B+G9`%g3~0A2QITPUB个人空间已更新 1 行。
s5z&A;dv Q;Qsid=10 pid=11> update aa_1 set name=lower(name) where id=2;
M)Y'KG,afgCp*Eoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netif:R1U'pk)U)|
会话12ib;|*} K.q5a
sid=12 pid=12> update aa_1 set name=lower(name) where id=2;
(^\FU0_hspace.itpub.net已更新 1 行。ITPUB个人空间f0r @(a;{t!iM
m

sid=12 pid=12> update aa_1 set name=lower(name) where id=1;3r+PD        \%m ck
ITPUB个人空间R:H,\2j5kk
会话10的命令先发布,因此,稍等之后,会话12会报出如下错误:*YS)pdn\
update aa_1 set name=lower(name) where id=1oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netZUf,X UAoY5e
       *B?IR&M        Qr
第 1 行出现错误:
-J2Iyg2t+CeORA-00060: 等待资源时检测到死锁
:e0E'd&oHOITPUB个人空间^1C+EWj"BL%g
这时,查找告警日志,可以发现如下死锁信息:
fse!T0\Qg/fSITPUB个人空间Mon Feb 18 12:43:51 2008
\:F3JBP;q.oORA-000060: Deadlock detected. More info in file e:\oracle\admin\mytwo\udump\mytwo_ora_348.trc.
CH[)[0{dspace.itpub.net5Kd6k'IGu{
按照指示,查看跟踪文件:
l
C
y        O o*X:loracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
                       ---------Blocker(s)--------  ---------Waiter(s)---------
z-V
@(@W KWdM
Resource Name          process session holds waits  process session holds waits
P$G6h`hq9NITPUB个人空间TX-0003000b-000008e0        12      12     X             11      10           X
h$},oV&WTX-00040009-00000991        11      10     X             12      12           XITPUB个人空间qn5jb1AI)|!X"P
session 12: DID 0001-000C-00000002        session 10: DID 0001-000B-00000002ITPUB个人空间 }9o        {ay*|Gz
session 10: DID 0001-000B-00000002        session 12: DID 0001-000C-00000002
$I-z#o/w0nRows waited on:'p+c"oq4LH)[ B!]
Session 10: obj - rowid = 000019ED - AAAB7zAAFAAAV02AAAITPUB个人空间Iex1M9EFI
  (dictionary objn - 6637, file - 5, block - 89398, slot - 0))s5g0n        K6xx v!w4jZR(R
Session 12: obj - rowid = 000019ED - AAAB7zAAFAAAV00AAA
Ia!e(@b

  (dictionary objn - 6637, file - 5, block - 89396, slot - 0)ITPUB个人空间b4q7Y;GX)A KQ"v1D
Information on the OTHER waiting sessions:oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net,m5vP Qsk
Session 10:oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net6Ecx X~.ky
  pid=11 serial=71 audsid=5634 user: 30/SCOTT
O/H/F        S$AQ.FPYITPUB个人空间  O/S info: user: JB\JJBOBO1, term: JB, ospid: 464:440, machine: WORKGROUP\JBITPUB个人空间        QOZ\)i!Rx8k
            program: sqlplus.exe
s)|
o+x.yZr%LITPUB个人空间
  application name: SQL*Plus, hash value=3669949024
r2|t.yJ~+~lITPUB个人空间  Current SQL Statement:
        S
JVL8FZ,U#G,z}ITPUB个人空间
  update aa_1 set name=lower(name) where id=2
#y/ZwY?2Mjoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netEnd of information on OTHER waiting sessions.1gO%|.wr'd
===================================================
x\3YDzb        w"eyITPUB个人空间下面还有PROCESS STATE,不再列出。Z
M2a%F1A"~


AH
C)RY5{}E
根据跟踪文件中的信息,应该足以找到死锁发生的位置。
}6E
U|bM!`;B        p,t

oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netb F.G?/Ji H
收到。
chenzhen232发布于2008-02-19 14:20:40
小妹的方法,很有创意嘛。
zergren发布于2008-02-19 15:29:07
赫赫,学习了。
ice_bean发布于2008-02-20 12:58:39
好东东
熊样文章 trigger_lau 发布于2008-02-21 11:58:29
女孩子这样确实不错。
lkypy发布于2008-03-12 14:46:59
不是一般人啊,学习中
我来说两句

(可选)

日历

« 2008-10-14  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 35153
  • 日志数: 31
  • 图片数: 4
  • 建立时间: 2008-02-15
  • 更新时间: 2008-05-29

RSS订阅

Open Toolbar