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

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

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

查看( 1533 ) / 评论( 26 )
大家都知道TM锁共有6种模式,最常见的是3(插入,更新,删除);4(创建索引时);5(部分DDL操作如:删除列)等等,这些锁比较容易看到,不再详述实验经过.有些操作速度过块,如:Truncate和Drop等.这时不容易看到锁的状态,下面我做了个小实验来看清楚这些速度较快的命令持有什么样的锁. 例如:Truncate和Drop
{J-N)coL]3i0
W#al'w(B0    因为命令执行速度快,只有靠脚本来快速观察.如下:ITPUB个人空间^ r M#Io"R P
create or replace procedure my_cursor is
:t y h;gF8@#gT0   cursor aa is select lmode from v$lock where type='TM' and sid=您的会话SID;
X^` h u Zd*g}}%U0   x number(3):=9;
fjs{.\W0 begin
2y`ak$U0   for i in 1..3000 loopITPUB个人空间+Bt,w e/{Y V ]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%PTn8q: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+qys"V1U|0b{A
结果如下:
k&Ue"Mm k0                        1--93       显示为9ITPUB个人空间Qbo$|S
                            94--126      显示为6ITPUB个人空间-P |6A%]of'Z ~t
                  127--217      显示为2
?e~ M$i&~0                   218--249      显示为3
3y(Wa+J_3p5j0                   250--266      显示为6ITPUB个人空间m!sF;T3d-i
                  267--结束    一直为9ITPUB个人空间#Y_*L*tX;G T u.x$i
ITPUB个人空间^&ab$Pfm(b
小结:在10G中只加了6锁,而9i中是236混杂出现,看来10G的截断操作比9i要简单明了,从算法上进步了不少哟~~  !^_^!ITPUB个人空间 v s$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的.
(^B1s DS sl5]0 ITPUB个人空间Tc Pd`OD|
其他执行速度比较快的操作,查看锁步骤类似,可以用上例一样的方式实验...TX锁相关事务,放到后面回滚段相关章节再发...

TAG:

shiri512003的个人空间 shiri512003 发布于2008-02-16 17:43:09
first
eagle_fan的个人空间 eagle_fan 发布于2008-02-16 17:46:46
你可以用10704 trace event,显示更为清楚准确space.itpub.netpg7D S#fzb{*x
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net tMtGAs)P
看我以前写的文章:
~l8B{aXD%t7W
Nk,A o)X'K S
Ioracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
http://www.dbafan.com/blog/?p=49
棉花糖ONE的个人空间 棉花糖ONE 发布于2008-02-16 17:58:02
mm的想法很好
烟囱的个人空间 烟囱 发布于2008-02-16 18:05:49
mm把这每天一课进行下去.
y2e8B#bW
|&L)nI moracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
我等收获不小哦.
F        qu\Nzoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
8p"F)C+eafv5`谢谢!
SingleLove的个人空间 SingleLove 发布于2008-02-16 19:03:35
不错,顶一个
Pilgrim的个人空间 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.
_S8t0C#V*[4{t0_g-m0Xp
思路不错!
ORACLE LIFE oradbHome 发布于2008-02-17 19:16:13
附加上 lock mode's-tjz6U&i8g-yZ
0 - none .E*Z5^SF E@-?
1 - null (NULL)
^@1X [8c8M{2 - row-S (SS)
.i9p6b e9@
w[5ek
3 - row-X (SX) ;V(l|7da'F
4 - share (S) 'Z {X2X
_

5 - S/Row-X (SSX) ITPUB个人空间-ji"z9S
N&i3VV

6 - exclusive (X)
o%H~
y
w E0?'Il4tn
就不用在去查数据字典了^_^
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-17 19:48:06
在各种文档中,对于这6种模式的锁,英文称呼个不相同,我把他总结了一下,如下:f
~(hgM1P
zi}k

0 - none
d-z~U8^oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net1 - null (NULL)
i^Py;I
D6pITPUB个人空间
2 - row-S (SS) 也简称rs锁
5b7Q(F5OVuo5L%r3 - row-X (SX)    rx
MlT"\-r,B4 - share (S)            6zo {~9E-d+b D4q!k
5 - S/Row-X (SSX)    srxspace.itpub.net~LT ~I+d&`U
Yf

6 - exclusive (X)
L:_3j3g        Uee2J2GA|ITPUB个人空间
]~/j;Ly其中2,3锁属于意向锁,关于这一点可以参考 萨师煊 和 王珊 的<数据库系统概论>这本书的并发控制那一张.        WdR
L&hwbJ!G

        H
k@;Je8Z5_:Ca

[ 本帖最后由 晶晶小妹 于 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 发表 p3}
^#\9}

看了一下,锁的一些概念还不太明白。
ITPUB个人空间!fFy!hiF
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net.O5M0j]Ne `
哪些不明白?? 
蚊子窝 foxmile 发布于2008-02-17 20:26:26
什么情况下会死锁。如何找到引发死锁的应用。
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-18 12:45:23

QUOTE:

原帖由 foxmile 于 2008-2-17 20:26 发表 ?'?h'vn:Bi[T
什么情况下会死锁。如何找到引发死锁的应用。
&V&v3q        L}
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net5bYK0l*}H;^
死锁发生之后,通常有一个会话会被中断,在告警日志里面会记录一些信息.
蚊子窝 foxmile 发布于2008-02-18 12:50:35
恩。了解。多谢!
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-18 13:04:22

QUOTE:

原帖由 foxmile 于 2008-2-17 20:26 发表 oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net4o]*k5`s/?
什么情况下会死锁。如何找到引发死锁的应用。
z$Fy#^.m

8C
MU3n:j*[&uoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
做了一个简单的实验:dF1a4w"P0GD)kd-?6f.Z
会话10:
~!I Qo,_7sdL*{
Toracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
sid=10 pid=11> update aa_1 set name=lower(name) where id=1;ITPUB个人空间J2ki5~:Q
已更新 1 行。x&v|:bD
sid=10 pid=11> update aa_1 set name=lower(name) where id=2;;K,y&KTW#XE\uru&q

M@C&R9@!yS!O/F-G会话12
9u2H/i3A|Q
N
sid=12 pid=12> update aa_1 set name=lower(name) where id=2;
&y+p%es.N9`M/mKXespace.itpub.net已更新 1 行。
w B8]U!f!OpYR"@,_sid=12 pid=12> update aa_1 set name=lower(name) where id=1;
D5K'k.z)}ejFNoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
r$~9EjM!F$Woracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net会话10的命令先发布,因此,稍等之后,会话12会报出如下错误:
p7J9SL!yU1S @E}~$lupdate aa_1 set name=lower(name) where id=1oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net8[(X+a        J)R)Q        O9pd
Z

       *
t&k,OqKoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net第 1 行出现错误:space.itpub.net2],O*@!k$D2y.Wo
ORA-00060: 等待资源时检测到死锁space.itpub.netN7u+Gy@|
}+mX

space.itpub.netES%V#\0e;Y
lde

这时,查找告警日志,可以发现如下死锁信息:
4i%a
^ t0P2D_N
Mon Feb 18 12:43:51 2008space.itpub.net6EQu        ?H
ORA-000060: Deadlock detected. More info in file e:\oracle\admin\mytwo\udump\mytwo_ora_348.trc./kCT B2oE#VO
`9^wh#r8gpRTx
按照指示,查看跟踪文件:space.itpub.netZf
E{uJ2{v
G

                       ---------Blocker(s)--------  ---------Waiter(s)---------
Kug:['a3Z Mspace.itpub.netResource Name          process session holds waits  process session holds waitsoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net&^"?8V"ZM9f}"Q
TX-0003000b-000008e0        12      12     X             11      10           Xm*l0F4I'[\A#^w
TX-00040009-00000991        11      10     X             12      12           X
bq1Lalq8p4o*~ITPUB个人空间session 12: DID 0001-000C-00000002        session 10: DID 0001-000B-00000002
6@^ g9B)d4?&|%Roracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netsession 10: DID 0001-000B-00000002        session 12: DID 0001-000C-00000002T)KkC2m
Rows waited on:
S
]3cW:_
m h-sI
Session 10: obj - rowid = 000019ED - AAAB7zAAFAAAV02AAA
}-s$t`N#A8c  (dictionary objn - 6637, file - 5, block - 89398, slot - 0)O-{0E)[S Oz
Session 12: obj - rowid = 000019ED - AAAB7zAAFAAAV00AAAa{OI8k [4]
  (dictionary objn - 6637, file - 5, block - 89396, slot - 0)
)Bupv!Nc!u/qspace.itpub.netInformation on the OTHER waiting sessions:
H0G4x0qA.rspace.itpub.netSession 10:l5e;D`D9dg
  pid=11 serial=71 audsid=5634 user: 30/SCOTToracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netBqe[U?`
  O/S info: user: JB\JJBOBO1, term: JB, ospid: 464:440, machine: WORKGROUP\JB
s&@!Yo iS3?6U;[ UITPUB个人空间            program: sqlplus.exeoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.neta8IN)tU2|
  application name: SQL*Plus, hash value=36699490246en&a)o0uv-G$pH
  Current SQL Statement:oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netsLq"L,s8?
  update aa_1 set name=lower(name) where id=2
-xPlx$J?,wITPUB个人空间End of information on OTHER waiting sessions.oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netTa-_%\xb|
===================================================oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net$wA9Q!bu&^;|
下面还有PROCESS STATE,不再列出。-M[zxgFO^-^!{
space.itpub.net/\[p#Z-l,V*S
根据跟踪文件中的信息,应该足以找到死锁发生的位置。
Hero--008的个人空间 Hero--008 发布于2008-02-18 13:29:58
如此学习态度,还有什么东西学不会的呢~~榜样阿!看齐~~
蚊子窝 foxmile 发布于2008-02-19 14:09:07

QUOTE:

原帖由 晶晶小妹 于 2008-2-18 13:04 发表
A%^e8Xv#F{2L        Ds
DX
L\6U;q%kporacle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net

h2A*Wl7K!Mkv$M KOITPUB个人空间做了一个简单的实验:
!N!E2mZ"v^会话10:
'_ d3O_nr ^sid=10 pid=11> update aa_1 set name=lower(name) where id=1;space.itpub.net-dQb;a*GR C
已更新 1 行。.b3hzWK.S8pt
sid=10 pid=11> update aa_1 set name=lower(name) where id=2;
Q`u:O8}0~^B6Y
QS}({4t$f会话12
HR+|n}cspace.itpub.netsid=12 pid=12> update aa_1 set name=lower(name) where id=2; S!m"v9P
WzNKC1aa        R

已更新 1 行。ITPUB个人空间(` Q!J
Gl/m+[

sid=12 pid=12> update aa_1 set name=lower(name) where id=1;
)?*K6HX/o
giC+AI会话10的命令先发布,因此,稍等之后,会话12会报出如下错误:
hwB9J%@RP.] Ooracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netupdate aa_1 set name=lower(name) where id=1
'qpnZ9k9z,l7a Ospace.itpub.net       *ITPUB个人空间a3R(_2@N        I%v;jCo0g
第 1 行出现错误: f!v$[HG        qpm
ORA-00060: 等待资源时检测到死锁+ld,? B)pV7l

,rV Y3tvry
Y%dG-rp
这时,查找告警日志,可以发现如下死锁信息:e:z"Gr@ F2U`+A
Mon Feb 18 12:43:51 2008
XvRya/QE4ObITPUB个人空间ORA-000060: Deadlock detected. More info in file e:\oracle\admin\mytwo\udump\mytwo_ora_348.trc.
%KX5C&^N"j        C&u1?
,t1h Qd:M9},S w$Hu按照指示,查看跟踪文件:
d&i6bh~Dspace.itpub.net                       ---------Blocker(s)--------  ---------Waiter(s)---------
Q.M2_9?vo+_e GResource Name          process session holds waits  process session holds waits
gJ:X7u5k6r(Z k5kspace.itpub.netTX-0003000b-000008e0        12      12     X             11      10           Xspace.itpub.net#\EOCc4R2vV+}
TX-00040009-00000991        11      10     X             12      12           X
&[ns%`2]YQspace.itpub.netsession 12: DID 0001-000C-00000002        session 10: DID 0001-000B-00000002
8fMBAITmk)noracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netsession 10: DID 0001-000B-00000002        session 12: DID 0001-000C-00000002
5Y[vX o0j}onRows waited on:oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net:Zj3ZOaI/t3L1w
Session 10: obj - rowid = 000019ED - AAAB7zAAFAAAV02AAA:a][6}@;{
  (dictionary objn - 6637, file - 5, block - 89398, slot - 0)[        Psg&~K]Lw
Session 12: obj - rowid = 000019ED - AAAB7zAAFAAAV00AAA
'G)x(z
f.I h2J0ZL
  (dictionary objn - 6637, file - 5, block - 89396, slot - 0)
QC*J7{{fCInformation on the OTHER waiting sessions:
7}-M.^uto
].N.uITPUB个人空间
Session 10:;Wl1B$JTG3[0p
  pid=11 serial=71 audsid=5634 user: 30/SCOTT
Rhs9\5k u$yf,Bspace.itpub.net  O/S info: user: JB\JJBOBO1, term: JB, ospid: 464:440, machine: WORKGROUP\JBITPUB个人空间^\ f/\*_ e!ev
            program: sqlplus.exe
3Q,}$mX$S[wspace.itpub.net  application name: SQL*Plus, hash value=3669949024ITPUB个人空间^ { d
B+R"Z

  Current SQL Statement:ITPUB个人空间,I5g1la.tdly*[
  update aa_1 set name=lower(name) where id=2ITPUB个人空间~4RzI {
End of information on OTHER waiting sessions.
8A^X#^ G-AC m@o#|===================================================
B fKx%Im2F下面还有PROCESS STATE,不再列出。
`1um9N!TtNq(rPspace.itpub.netHX t#a P&VC$rIs
根据跟踪文件中的信息,应该足以找到死锁发生的位置。
ITPUB个人空间5i1wS;x(_

x3s        G,{0Xa收到。
chenzhen232的个人空间 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
不是一般人啊,学习中
foreverlee的个人空间 foreverlee 发布于2009-01-05 19:10:23
you are awesome.
Conclusion as I tested in 10gR2.
)Ne,j X"cbvoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netLS*~#^#a6r
WwR%Q~

1>  create index az_obj_id. (4-TM)space.itpub.net5g
}8ss/Rz


8Uk
u7Eg-_P(H!|3y
2>
FOXe.}1{@(?&HITPUB个人空间alter index az_obj_id rebuild online; (2-TM and 4-TM)

Vr7C#^ du

        guVH+jc8^:PJ3> ITPUB个人空间;y"K(wxV-x%^
alter index az_obj_id rebuild; (4-TM and 3-TM)
"j1F/X!I @_]oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
|1M3c$_A]]BnITPUB个人空间4>
CO{+W;P?JHo#HeDalter table az move tablespace test; (6-TM)
h7tiX,{ L9woITPUB个人空间space.itpub.net5~V        Y        `:["t&a
5>
u6Txp:B(F

alter table az shrink space; (3-TM and 6-TM  But the amount of time for TM 6 is far more less than ALTER TABLE MOVE)
R*gF(h1^epK2p^%z`G
6>oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netOO%Xb.v!J
alter table az shrink space COMPACT; (3-TM only)oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net6D?@/i7dn
and then alter table az shrink space; (6-TM only)-`#{_"a"C)R
Please see shrinkSpaceIn10g.doc in the same direcotry to find the mechanism for SHRINK SPACE in Oracle 10g. \joYkg6\m

S }:s}u"u7> truncate table az;(DDL) (6-TM)
foreverlee的个人空间 foreverlee 发布于2009-01-05 19:12:03

QUOTE:

原帖由 eagle_fan 于 2008-2-16 17:46 发表
;Bzu2P0V'G你可以用10704 trace event,显示更为清楚准确*K4z:hG#cd5MP}Z

){Ll*IH
yt+RS
看我以前写的文章:
!p?'p{-FNC
#iV@Z-chttp://www.dbafan.com/blog/?p=49
k;YJA        S*XXTfO1}J

(\f1Iz#lo0T$KZITPUB个人空间Great
我来说两句

(可选)

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

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

RSS订阅

Open Toolbar