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

晶晶实验五_讨论锁 篇

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

查看( 1476 ) / 评论( 24 )
锁是保护和用户相关的资源,例如:表,用户,会话.
k"S9jT!B&q;?0    和闩比起来,锁的实现要复杂的多.锁的获取和释放也没有闩快,有些锁持有的时间会比较长,如果说TM锁和TX锁.在DML操作中,用户不提交,这两个锁就不会被释放.锁主要保护会话层面上的一些资源.理解锁的原理还是比较简单的.不过先要明白相关锁的一些数据结构.下面我们先从介绍锁相关的数据结构开始入手.ITPUB个人空间W!d~*t1WZs;Fx'q
   一,池ITPUB个人空间]ny.H A F
    在SGA中和锁相关的内存区有两块.我分别称呼他们为'队列资源池'和'锁池'.池其实指的就是一块固定大小的内存,是计算机中经常会用到的一个计算机术语.
Ql ? M"pA0     队列资源池:存放所有的队列资源.所有的队列锁都是队列资源.例如:一个表上的TM锁就是一个队列资源.一个数据库中可以有成千上万个表,每个表的TM锁,都是单独的一个队列资源.为了对他们加以区分,要为这各个表的TM队列资源起个名字,名字的格式'队列资源类型-id1-id2'.id1 和id2分别是两个相关某种队列资源的信息,这两个信息根据不同的队列资源类型而不同,对于TM队列资源来说,id1取值通常是表的对象编号,(可以在dba_objects视图中的object_id或data_object_id列查看).id2取值为0.也就是说对于TM类型的队列资源来说,有多少个表就有多少个TM队列资源.如果有一个表的TM队列资源被占用,他就会被放进队列资源池.队列资源池的大小可以如下命令查询得知:
?E7w7{:xSGL d0 SQL> select * from v$resource_limit where resource_name='enqueue_resources';ITPUB个人空间zw*xP1GRcwS/n

jh E.fVa1X0ON0 RESOURCE_NAME                  CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION   LIMIT_VALUE
U~m4l+{1D0 ------------------------------ ------------------- --------------- -------------------- --------------------
3E2@I YWtI0 enqueue_resources                               18              46       1208            UNLIMITED
ud p XO7M0
;k{4|sFK0 如上显示,10G中默认的队列资源池初始分配1208个条目.每个队列资源条目在池中只占很少的信息,其中主要包括:队列资源名,所有者队列链表地址,等待者队列链表地址和转换者队列链表等信息.在队列资源池中,只记录这3种队列的头地址,而一个队列资源上真正的锁信息是记录在锁池中的.例如:两个会话修改了同一个表的不同行,两个会话并不互相阻塞.表的ID是2000,这里我们以TM锁为例,会有一个新的队列资源被占用,其名字是<TM-2000-0> 他会有两个持有者,队列资源池中会有一个空闲条目被占用,其信息包括:队列资源名和持有者队列的链表头.但真正的两个持有者的相关信息,被存储在锁池中.如下命令可以显示锁池的大小:ITPUB个人空间5?z.J*pUo1]h9\FKW
SQL> select * from v$resource_limit where resource_name='enqueue_locks';ITPUB个人空间&W%Hn9gB

b}!YyKx0 RESOURCE_NAME                  CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION   LIMIT_VALUEITPUB个人空间(f5x.\y,a't
------------------------------ ------------------- --------------- -------------------- --------------------ITPUB个人空间lEdW m0G
enqueue_locks                                   18              30       2950                 2950ITPUB个人空间[-JB#SD [9M*R

3Y4l0Ip;b0 锁池:会话持有任意一个队列资源的信息,保存在锁池中.就象上面的例子,两个会话分别持有了一个表的TM队列资源,这两个会话的信息被保存在锁池中,而队列资源信息保存在队列资源池中,队列资源信息和锁池中的各会话持有或等待某资源的信息,合在一起被称为队列锁.还以上例为准,队列资源池中的<TM-2000-0>,几个链表的头等信息,和锁池中的两个持有者的信息,合在一起,称为一个TM队列锁.下面用一个图来说明:ITPUB个人空间|*]"}t|S5M_y F9Ij
   
+P Pyy-X0   因为俺是新ID,好象没有发图片滴权限... 只好把图片上传到俺滴blog中 连接是:ITPUB个人空间"KF7gG ` }E
http://space.itpub.net/13095417/viewspace-172808ITPUB个人空间D)`?#U"G"^9eC
  大家凑合看吧.ITPUB个人空间Uv|$J,}nE|6`
图解如下:上图是我分别在10和12号会话修改6657表后,<TM-6657-0>的相关情况,另外,由于队列资源池中的条目较多,为了能够快速的在池中查找某一条目,所以队列资源池采用HASH表的方式进行查找.oracle将根据每个条目的队列资源名,生成一个HASH值,如果想申请某一个队列资源上的锁,会先根据HASH值,在HASH表中,查找相关的资源.上图中的7b6d5c40就是HASH表中所记载的<TM-6657-0>在资源队列池中的地址.之所以[7b6d5c40,7b6d5c40]这样的形式记载,是因为某一个HASH值所对应的队列资源可能不止一个.这将构成一个链表,中括号的两个数字,代表链表的首指针和尾指针.对某一个HASH值下链表的访问也需要enqueue hash chain闩的保护.具体的就不多说了,相关文档都有介绍.在锁池中就不需要针对锁池的HASH 表咯,因为我们不需要直接在锁池中搜索某一个持有者或等待者.两个池各有自己的Resource free链表,管理空闲的条目.明白了这些有关队列锁的数据结构,队列锁的获取和释放过程就非常简单了.这就不在详细多说,可以参考文档.

TAG:

stronghearted的个人空间 stronghearted 发布于2008-02-17 22:20:40
概念好清晰噢!
蚊子窝 foxmile 发布于2008-02-18 10:06:18
支持。
bluemoon0083发布于2008-02-18 10:22:35
支持晶晶mm
李想的个人空间 lixiang114 发布于2008-02-18 10:33:44
pub里女孩不多,一定要支持!!!
jlliuyi发布于2008-02-18 10:35:21
好文章!
catchwo的个人空间 catchwo 发布于2008-02-18 11:32:07
前一阵子也了解了解了队列,锁,资源。我认为这三个东西不能这样单独的区分开来理解,下面是我整理出来的一些结构希望有助于理解这三个东西
H\k1o2P2Fh#A        A$Vg0eoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
&G T+FW{6\oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net注意gv$lock,gv$_lock1,gv$enqueue_lock的定义oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netBgS zS&i7Z(Qy

g@,y![kSELECT * FROM V$RESOURCEITPUB个人空间1V^V dgC V
SELECT * FROM V$enqueue_Lock
#d9I%x)k9i0P5^q~:icspace.itpub.netSELECT * FROM V$LOCK space.itpub.net4V#~j{~ k
space.itpub.netZ
KD8Ih4It{z

select * from X$KSQDN - Global [D]atabase [N]ame                                      n)rQ
`.ghW$kj

select * from X$KSQEQ - [E]n[Q]ueue Object                                            k#f'V0~8VETjm
select * from X$KSQRS - Enqueue [R]e[S]ource                                          
z0Fs/E i:M

select * from X$KSUSE - [SE]ssion Info  ,d_;Q8bRg
select * from X$KTCXB - Transaction O[B]ject
iCi*}f%z#F\ O8Cselect * from X$KTADM - D[M]L lock
"z6U$G)a^Mr,bspace.itpub.netselect * from X$KDNSSF - [F]lush Enqueue ObjectsiA4M9W?,Z
select * from X$KSUSE - [SE]ssion Info
e ?I4b3Gspace.itpub.net.u;v0i H
b/h'^

select * from v$fixed_view_definition where view_name like '%V%LOCK%'oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.neth9^F-ykx|

Y Det9Jg%fcE\oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netGV$SESSION        ITPUB个人空间h'qNSd6d#i YZ[r)U
select inst_id,addr,indx,ksuseser,ksuudses,ksusepro, ksuudlui,ksuudlna,ksuudoct, ksusesow, decode(ksusetrn,hextoraw('00'),null,ksusetrn), decode(ksqpswat,hextoraw('00'),null,ksqpswat), decode(bitand(ksuseidl,11),1,'ACTIVE',0, decode(bitand(ksuseflg,4096),0,'INACTIVE','CACHED'),2,'SNIPED',3,'SNIPED', 'KILLED'), decode(ksspatyp,1,'DEDICATED',2,'SHARED',3,'PSEUDO','NONE'), ksuudsid,ksuudsna,ksuseunm,ksusepid,ksusemnm,ksusetid,ksusepnm, decode(bitand(ksuseflg,19),17,'BACKGROUND',1,'USER',2,'RECURSIVE','?'), ksusesql, ksusesqh, ksusepsq, ksusepha, ksuseapp, ksuseaph,  ksuseact, ksuseach, ksusecli, ksusefix,  ksuseobj, ksusefil, ksuseblk, ksuseslt, ksuseltm, ksusectm,  decode(bitand(ksusepfl, 16),0,'NO','YES'),  decode(ksuseft, 2,'SESSION', 4,'SELECT',8,'TRANSACTIONAL','NONE'), decode(ksusefm,1,'BASIC',2,'PRECONNECT',4,'PREPARSE','NONE'), decode(ksusefs, 1, 'YES', 'NO'), ksusegrp,  decode(bitand(ksusepfl,16),16,'ENABLED',   decode(bitand(ksusepfl,32),32,'FORCED','DISABLED')),  decode(bitand(ksusepfl,64),64,'FORCED',   decode(bitand(ksusepfl,128),128,'DISABLED','ENABLED')),  decode(bitand(ksusepfl,512),512,'FORCED',   decode(bitand(ksusepfl,256),256,'DISABLED','ENABLED')),  ksusecqd, ksuseclid  
'aZWj0F^space.itpub.netfrom x$ksuse

{i8@m V{'Fospace.itpub.net
where bitand(ksspaflg,1)!=0 and bitand(ksuseflg,1)!=0+D+tE3lpa8{
Z1r+zqGi f YA
C

GV$RESOURCE        space.itpub.netk8U H"k;ql
select inst_id,addr,ksqrsidt,ksqrsid1,ksqrsid2 from x$ksqrs where bitand(ksqrsflg,2)!=0X8C$\]8H7JY G

*u2b}{(G(L7}_space.itpub.netGV$_LOCK1
{3TF}/zITPUB个人空间select inst_id,addr,ksqlkadr,ksqlkses,ksqlkres,ksqlkmod,ksqlkreq, ksqlkctim, ksqlklblk
y?;Hl gyfrom x$kdnssf where bitand(kssobflg,1)!=0 and (ksqlkmod!=0 or ksqlkreq!=0)
Drp.Q@+Z5Sunion all `{?&V opN'{L
select inst_id,addr,ksqlkadr,ksqlkses,ksqlkres,ksqlkmod,ksqlkreq, ksqlkctim, ksqlklblk
#Sa&uj^Rfrom x$ksqeq where bitand(kssobflg,1)!=0 and (ksqlkmod!=0 or ksqlkreq!=0)space.itpub.net\8D,u        `2OMo5~
'ozDpzZ
GV$_LOCK0?)|!xq&_I8uP
select USERENV('Instance'),laddr,kaddr,saddr,raddr,lmode,request,ctime,  block from v$_lock1
Xh        t K5B        Ounion all select inst_id,addr,ksqlkadr,ksqlkses,ksqlkres,ksqlkmod,ksqlkreq, ksqlkctim,ksqlklblk
l!^
DKP!~X8Qspace.itpub.net
from x$ktadm where bitand(kssobflg,1)!=0 and (ksqlkmod!=0 or ksqlkreq!=0) oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netc!ARW2ev@
union all select inst_id,ktcxbxba,ktcxblkp,ksqlkses,ksqlkres,ksqlkmod,ksqlkreq, ksqlkctim,ksqlklblk space.itpub.net2}2b1M
xv%f

from x$ktcxb where bitand(ksspaflg,1)!=0 and (ksqlkmod!=0 or ksqlkreq!=0)
le-o'f
I:Bl
s}3N

(KH,u"a
Ty MITPUB个人空间
GV$LOCK       
^x~)T5K.Coracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netselect /*+ ordered use_nl(l), use_nl(s), use_nl(r) +*/  s.inst_id, l.laddr, l.kaddr, s.ksusenum,  r.ksqrsidt, r.ksqrsid1, r.ksqrsid2,  l.lmode, l.request,l.ctime,  decode(l.lmode, 0, 0, l.block)  oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netV(^m,CM&a
from v$_lock l,x$ksuse s,x$ksqrs r
-x3_Vf)bITPUB个人空间where l.saddr=s.addr and l.raddr=r.addr
z        ~\p;woracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netITPUB个人空间[6\2??:^7P8Z
GV$ENQUEUE_LOCK        oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netY?] XC\Z
select /*+ ordered use_nl(l), use_nl(s), use_nl(r) +*/  s.inst_id,l.addr,l.ksqlkadr,s.ksusenum,r.ksqrsidt,r.ksqrsid1,r.ksqrsid2, l.ksqlkmod, l.ksqlkreq,l.ksqlkctim,l.ksqlklblk
;Pv9\#Vbfrom x$ksqeq l,x$ksuse s,x$ksqrs r space.itpub.netLKw~Z
F

where l.ksqlkses=s.addr and  bitand(l.kssobflg,1)!=0 and (l.ksqlkmod!=0 or l.ksqlkreq!=0) and  l.ksqlkres=r.addr&n:r!]qe-hrl

8M;?u"p
C$e

jc
r&j6h4L7H D
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netz \7DGl&g2` d
1 每条ddl语句开始时[commit|rollback],begin with a transaction,end with[commit|rollback]ITPUB个人空间{DZ3TY\*x!c
2 row-level lock 事务TX[X]
!h0WY$[o    a 开始时检查是否能获得所有row-level lock ITPUB个人空间(C:H&{{/MiU
    b 如果能则lockb*\7C/f-v#B.]%J%r
    c 如果不能 则进入 TX[1] 等待LIST,此时并不设置任何row-level lock
4w O(Zro*{ITPUB个人空间    d TX[1]释放触发等待LIST检查此时TX[X]再次进入步骤[a],如果有其他TX锁定了相关数据则TX[X]再次进入等待LIST    ITPUB个人空间:t6^Ko UWTL
2 DML LOCK IS TYPE OF TM LOCKspace.itpub.netC+|w$_#{U(R#`(Xf4x
3 LOCK 来源mZ2_%S4F1l f$^
  KT [T]ransaction Layer                                                         
+~5w]-j)]+H,_F,b}      Table [A]ccess [D]efinition                                               
H(uI&^ pqoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net        X$KTADM - D[M]L lock                                                    4_&jyq*[ S4~_
      [C]ontrol Component                                                      
\^T-FG_ Ru        X$KTCXB - Transaction O[B]ject   oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net*cqB-SH e;@G
  KG [G]eneric Layer------library cache lock and pin                                                                           
M0GvC:h Xh3a

      [L]ibrary Cache Manager  ( defined and mapped from kqlf )                             ITPUB个人空间T9j_`On$Yt
        Object Locks                                                            
C-gjV9o'K3ot_ITPUB个人空间          X$KGLLK - Object [L]oc[K]s   

?Opy.^2FA+L?zcspace.itpub.net
        Object Pins                                                            
Y*y6}6u C
~CSVspace.itpub.net
          X$KGLPN - Object [P]i[N]s                                                                         !J#^{'yd
  KS En[Q]ueue Management------enqueue lock                                                                                         oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netia@nh
P:uV'L

        X$KSQEQ - [E]n[Q]ueue Object
-z.O#r
T%^'X:S'Z
  KD [D]ata Layer                                                                oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netk\ev/v'L&z)z
      Sequence [N]umber Component                                                                  
b6|6y \coracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net        [S]equence Enqueues - common area for enqueue objects                                     space.itpub.netcK1cL)f%RF{~
          X$KDNSSF - [F]lush Enqueue Objects - 7.2 or lower
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-18 12:15:52
回7楼的前辈:oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net?+Wc)[_0jR6h%Y}
mP

  先说第一句,队列,锁,资源这三个概念我没有分开来理解吖?这三个合在一起就是队列锁.队列和资源其实一个概念,我称他们为队列资源,用来存储队列资源的内存大小可以通过 v$resource_limit查询enqueue_resources得到.这一部分也就是我所说的队列资源池,某一个队列资源上的等待者 持有者和转换者相关的信息,并不在队列资源池中存储,而在另外一块内存中存储,大小可以在v$resource_limit视图中enqueue_locks查到.也就是我所说的锁池,锁池和队列资源池中的信息合一起 称呼为一个队列资源锁.space.itpub.net\c8o!G]b7T#~
;`/Q!f8?4SC
  
H1ss-J,`vpspace.itpub.net   所有的队列资源池中的条目都在x$ksqrs中存储.在v$resource显示正在被使用的条目,锁池中正在被使用的条目可以在x$ksqeq中看到,正在被使用的在v$enqueue_lock中显示,但是TM和TX这两个队列锁和其他的不一样,除非他们发生了 enqueue等待,否则他们并不在x$ksqeq中显示,oracle使用不同的结构来管理TM和TX. TX的是x$ktcxb.它是 v$transaction_enqueue的基础视图.它的尺寸有transactions 这个初始化参数控制.TM 是x$ktadm 尺寸由 DML_LOCKS定义也就是TM锁的数量,x$ktadm意义不大可以为我们提供锁的模式,加锁的时间,正在请求的模式,会话SID等信息.信息量并不比v$lock中的多.通过以上两个X$视图观察正在使用中的TM,TX锁的最好办法是,8OS%B7\g6Ed&|

V:^]8B)Y0k5[set linesize 800
0d(A;k|,B4b5_j/g)Doracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netcol KTCXBNAM for a20
6\g!S`Lb,w'_"hselect * from x$ktcxb where ktcxblkp in(select kaddr from v$lock where type='TX');
s(ot&}kspace.itpub.net

f,^2R        PdLWVA[
select * from x$ktadm where ksqlkadr in(select kaddr from v$lock where type='TM');
KB
T"^L*HMy


        U.V+V^pO R  我觉的有关于锁的X$视图,意义不是太大,他们所能提供的信息,要么是晦涩难懂,要么已经可以通过v$视图很方便的看到.
%ODX5\[?&xspace.itpub.net
@"]&{!rGZWoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net  TX锁涉及事务,在以后的晶晶实验系列中,会找一篇详细介绍的.
蚊子窝 foxmile 发布于2008-02-18 12:23:42
好。大家鼓掌。感谢老虎、eygle、biti。。。。。
teddyboy发布于2008-02-18 12:25:09
小晶晶好pp啊!
*}u$P.A6O*N,x!v'Yoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net;o xq$Cx9[k
[ 本帖最后由 teddyboy 于 2008-2-18 12:42 编辑 ]
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-18 13:12:07

QUOTE:

原帖由 foxmile 于 2008-2-18 12:23 发表
Tq@(mid'O7a
wITPUB个人空间
好。大家鼓掌。感谢老虎、eygle、biti。。。。。
t"?4jq6T$_
9ly$U$a;M
J6r[oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
:M\&NIA

西瓜 BTxigua 发布于2008-02-18 13:15:06
牛!!!!!
.sBz I8v#p3qoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net有潜力。
cyt2005发布于2008-02-18 13:36:47
up~
catchwo的个人空间 catchwo 发布于2008-02-18 13:46:01

QUOTE:

原帖由 晶晶小妹 于 2008-2-18 12:15 发表 space.itpub.net0w9t
QL
cz

回7楼的前辈:
1fN9FRe3IJ2[  先说第一句,队列,锁,资源这三个概念我没有分开来理解吖?这三个合在一起就是队列锁.队列和资源其实一个概念,我称他们为队列资源,用来存储队列资源的内存大小可以通过 v$resource_limit查询enqueue_resources得到.这一部分也就是我所说的队列资源池,某一个队列资源上的等待者 持有者和转换者相关的信息,并不在队列资源池中存储,而在另外一块内存中存储,大小可以在v$resource_limit视图中enqueue_locks查到.也就是我所说的锁池,锁池和队列资源池中的信息合一起 称呼为一个队列资源锁.
gk,U/E9QQ7x-Ac%P*]space.itpub.net
fE%\*{ Vspace.itpub.net  
Q/I/by|'y+E:j0P$M   所有的队列资源池中的条目都在x$ksqrs中存储.在v$resource显示正在被使用的条目,锁池中正在被使用的条目可以在x$ksqeq中看到,正在被使用的在v$enqueue_lock中显示,但是TM和TX这两个队列锁和其他的不一样,除非他们发生了 enqueue等待,否则他们并不在x$ksqeq中显示,oracle使用不同的结构来管理TM和TX. TX的是x$ktcxb.它是 v$transaction_enqueue的基础视图.它的尺寸有transactions 这个初始化参数控制.TM 是x$ktadm 尺寸由 DML_LOCKS定义也就是TM锁的数量,x$ktadm意义不大可以为我们提供锁的模式,加锁的时间,正在请求的模式,会话SID等信息.信息量并不比v$lock中的多.通过以上两个X$视图观察正在使用中的TM,TX锁的最好办法是,
4y2^,m2w
L-Z        ~F,Kspace.itpub.net

6D^$K
QZ(g
q5Lt,AITPUB个人空间
set linesize 800oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
J"[2MR#d$|CQ

col KTCXBNAM for a20uHYO
Jn*\W

select * from x$ktcxb where ktcxblkp in(select kaddr from v$lock where type='TX');
F?q&~"I?p+Tspace.itpub.net
"GGy3@r [HITPUB个人空间select * from x$ktadm where ksqlkadr in(select kaddr from v$lock where type='TM');ITPUB个人空间b5s@.{x x]_`w6j-[

cZ9r,\s        Rt  我觉的有关于锁的X$视图,意义不是太大,他们所能提供的信息,要么是晦涩难懂,要么已经可以通过v$视图很方便的看到.
-nd3Y[+Uioracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netspace.itpub.net4d^_'o&IQ

G%T        X5GvgA'ev$Voracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net  TX锁涉及事务,在以后的晶晶实验系列中,会找一篇详细介绍的.
Bin`Wh
^3h:O
s e'w,Sz]

不错  这段说明非常好!晶晶是个高手
gy8o|&l0`X Yy
*m/lPr)L Zr$gk回“我觉的有关于锁的X$视图,意义不是太大,他们所能提供的信息,要么是晦涩难懂,要么已经可以通过v$视图很方便的看到.” oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net FFSH,?
我是用来发掘三者的关系
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-18 13:49:35
谢谢14楼前辈的夸奖,嘻嘻~~
\wLz$jd|ITPUB个人空间努力ing #|&Uf        omOckq
^_^
xilangxiangwa的个人空间 xilangxiangwa 发布于2008-02-18 14:02:33
先学习了你的这种钻研精神,有时间再来学习你的钻研成果.
AAA wangfans 发布于2008-02-18 15:24:50
支持
halfh2o发布于2008-02-19 10:00:35
学习心得,支持.
fat_fish的个人空间 fat_fish 发布于2008-02-19 10:16:36
支持
lkypy发布于2008-03-12 15:38:34
学习。。。
lkypy发布于2008-03-13 12:41:01
继续学习中
SingleLove的个人空间 SingleLove 发布于2008-03-13 13:26:57
不错,以前对锁只是一些表面的理解。看了晶晶姑娘的帖子让我又有了新的认识!!支持
bartfj的个人空间 bartfj 发布于2008-03-26 10:51:06
对锁了解一点了,谢谢晶晶
八二八空间 linjia828 发布于2008-03-26 11:14:24
晶晶写的不错,期待下篇关于X锁涉及事务的文档
xiaodong_1567的个人空间 xiaodong_1567 发布于2008-04-13 15:09:09
也来支持一下
我来说两句

(可选)

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

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

RSS订阅

Open Toolbar