没有必胜的秘籍,没有方程式遵循~~
要赢~~只有全身心的投入!
晶晶实验五_讨论锁 篇
上一篇 / 下一篇 2008-02-17 22:04:50 / 个人分类:晶晶oracle实验系列
查看( 821 ) /
评论( 24 )
锁是保护和用户相关的资源,例如:表,用户,会话.
DE6b$]*Q0 和闩比起来,锁的实现要复杂的多.锁的获取和释放也没有闩快,有些锁持有的时间会比较长,如果说TM锁和TX锁.在DML操作中,用户不提交,这两个锁就不会被释放.锁主要保护会话层面上的一些资源.理解锁的原理还是比较简单的.不过先要明白相关锁的一些数据结构.下面我们先从介绍锁相关的数据结构开始入手.
oH |Pz$x{%hp%J&h0 一,池
1gX#_D+w K0cN"t0 在SGA中和锁相关的内存区有两块.我分别称呼他们为'队列资源池'和'锁池'.池其实指的就是一块固定大小的内存,是计算机中经常会用到的一个计算机术语.ITPUB个人空间7@ b _}_9o^0J
队列资源池:存放所有的队列资源.所有的队列锁都是队列资源.例如:一个表上的TM锁就是一个队列资源.一个数据库中可以有成千上万个表,每个表的TM锁,都是单独的一个队列资源.为了对他们加以区分,要为这各个表的TM队列资源起个名字,名字的格式'队列资源类型-id1-id2'.id1 和id2分别是两个相关某种队列资源的信息,这两个信息根据不同的队列资源类型而不同,对于TM队列资源来说,id1取值通常是表的对象编号,(可以在dba_objects视图中的object_id或data_object_id列查看).id2取值为0.也就是说对于TM类型的队列资源来说,有多少个表就有多少个TM队列资源.如果有一个表的TM队列资源被占用,他就会被放进队列资源池.队列资源池的大小可以如下命令查询得知:
C {/XmIa$c7C9j0 SQL> select * from v$resource_limit where resource_name='enqueue_resources';
^5@q B1vx7{0 ITPUB个人空间 Nsp*RbuE7{
RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION LIMIT_VALUEITPUB个人空间`4I%r6cr&P
------------------------------ ------------------- --------------- -------------------- --------------------ITPUB个人空间z&TG#le8ot
enqueue_resources 18 46 1208 UNLIMITED
RJ;t)iY%^R$U9z0
.f }3]3Qni!l0 如上显示,10G中默认的队列资源池初始分配1208个条目.每个队列资源条目在池中只占很少的信息,其中主要包括:队列资源名,所有者队列链表地址,等待者队列链表地址和转换者队列链表等信息.在队列资源池中,只记录这3种队列的头地址,而一个队列资源上真正的锁信息是记录在锁池中的.例如:两个会话修改了同一个表的不同行,两个会话并不互相阻塞.表的ID是2000,这里我们以TM锁为例,会有一个新的队列资源被占用,其名字是<TM-2000-0> 他会有两个持有者,队列资源池中会有一个空闲条目被占用,其信息包括:队列资源名和持有者队列的链表头.但真正的两个持有者的相关信息,被存储在锁池中.如下命令可以显示锁池的大小:
+v+E2N j+D^],r)Yn0 SQL> select * from v$resource_limit where resource_name='enqueue_locks';
t8P(fQ,N2D.c0 ITPUB个人空间/fjBRN'C8`9Of
RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION LIMIT_VALUE
]%T } A:Xm0 ------------------------------ ------------------- --------------- -------------------- --------------------
-G$p jm ai$m0 enqueue_locks 18 30 2950 2950ITPUB个人空间L6k L6hL$AZ-\
5`0]u"O6[0vn(~0 锁池:会话持有任意一个队列资源的信息,保存在锁池中.就象上面的例子,两个会话分别持有了一个表的TM队列资源,这两个会话的信息被保存在锁池中,而队列资源信息保存在队列资源池中,队列资源信息和锁池中的各会话持有或等待某资源的信息,合在一起被称为队列锁.还以上例为准,队列资源池中的<TM-2000-0>,几个链表的头等信息,和锁池中的两个持有者的信息,合在一起,称为一个TM队列锁.下面用一个图来说明:ITPUB个人空间?/}N&Xs X;S
DE6b$]*Q0 和闩比起来,锁的实现要复杂的多.锁的获取和释放也没有闩快,有些锁持有的时间会比较长,如果说TM锁和TX锁.在DML操作中,用户不提交,这两个锁就不会被释放.锁主要保护会话层面上的一些资源.理解锁的原理还是比较简单的.不过先要明白相关锁的一些数据结构.下面我们先从介绍锁相关的数据结构开始入手.
oH |Pz$x{%hp%J&h0 一,池
1gX#_D+w K0cN"t0 在SGA中和锁相关的内存区有两块.我分别称呼他们为'队列资源池'和'锁池'.池其实指的就是一块固定大小的内存,是计算机中经常会用到的一个计算机术语.ITPUB个人空间7@ b _}_9o^0J
队列资源池:存放所有的队列资源.所有的队列锁都是队列资源.例如:一个表上的TM锁就是一个队列资源.一个数据库中可以有成千上万个表,每个表的TM锁,都是单独的一个队列资源.为了对他们加以区分,要为这各个表的TM队列资源起个名字,名字的格式'队列资源类型-id1-id2'.id1 和id2分别是两个相关某种队列资源的信息,这两个信息根据不同的队列资源类型而不同,对于TM队列资源来说,id1取值通常是表的对象编号,(可以在dba_objects视图中的object_id或data_object_id列查看).id2取值为0.也就是说对于TM类型的队列资源来说,有多少个表就有多少个TM队列资源.如果有一个表的TM队列资源被占用,他就会被放进队列资源池.队列资源池的大小可以如下命令查询得知:
C {/XmIa$c7C9j0 SQL> select * from v$resource_limit where resource_name='enqueue_resources';
^5@q B1vx7{0 ITPUB个人空间 Nsp*RbuE7{
RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION LIMIT_VALUEITPUB个人空间`4I%r6cr&P
------------------------------ ------------------- --------------- -------------------- --------------------ITPUB个人空间z&TG#le8ot
enqueue_resources 18 46 1208 UNLIMITED
RJ;t)iY%^R$U9z0
.f }3]3Qni!l0 如上显示,10G中默认的队列资源池初始分配1208个条目.每个队列资源条目在池中只占很少的信息,其中主要包括:队列资源名,所有者队列链表地址,等待者队列链表地址和转换者队列链表等信息.在队列资源池中,只记录这3种队列的头地址,而一个队列资源上真正的锁信息是记录在锁池中的.例如:两个会话修改了同一个表的不同行,两个会话并不互相阻塞.表的ID是2000,这里我们以TM锁为例,会有一个新的队列资源被占用,其名字是<TM-2000-0> 他会有两个持有者,队列资源池中会有一个空闲条目被占用,其信息包括:队列资源名和持有者队列的链表头.但真正的两个持有者的相关信息,被存储在锁池中.如下命令可以显示锁池的大小:
+v+E2N j+D^],r)Yn0 SQL> select * from v$resource_limit where resource_name='enqueue_locks';
t8P(fQ,N2D.c0 ITPUB个人空间/fjBRN'C8`9Of
RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION LIMIT_VALUE
]%T } A:Xm0 ------------------------------ ------------------- --------------- -------------------- --------------------
-G$p jm ai$m0 enqueue_locks 18 30 2950 2950ITPUB个人空间L6k L6hL$AZ-\
5`0]u"O6[0vn(~0 锁池:会话持有任意一个队列资源的信息,保存在锁池中.就象上面的例子,两个会话分别持有了一个表的TM队列资源,这两个会话的信息被保存在锁池中,而队列资源信息保存在队列资源池中,队列资源信息和锁池中的各会话持有或等待某资源的信息,合在一起被称为队列锁.还以上例为准,队列资源池中的<TM-2000-0>,几个链表的头等信息,和锁池中的两个持有者的信息,合在一起,称为一个TM队列锁.下面用一个图来说明:ITPUB个人空间?/}N&Xs X;S