理解锁和闩(1)与锁相关的数据结构
来源:互联网 发布:第三方代发打印软件 编辑:程序博客网 时间:2024/05/01 15:18
在oracle眼里,锁不是稀有资源,相反地,只要需要,你就应该长期地持有对数据所加的锁。行级锁根本没有相关开销,对1千万行锁定所需的资源数与对1行锁定所需的资源数完全相同,这是个常量。
在SGA中和锁相关的内存有两块:队列资源池和锁池。池:指的就是一块固定大小的内存。
队列资源池:存放所有的队列资源.锁就是队列资源。
例如:一个表上的TM锁就是一个队列资源,有多少个表就有多少个TM队列资源,如果有一个表的TM锁被持有,他就会被放进队列资源池。为了对他们加以区分,要为各个表的TM队列资源起个名字,名字的格式'队列资源类型-id1-id2‘。
例如:
两个会话修改了同一个表的不同行,两个会话并不互相阻塞.表的ID是2000,这里我们以TM锁为例,队列资源池中会有一个空闲条目被占用,其名字是<TM-2000-0>,其信息包括:队列资源名和持有者队列的链表头.但真正的两个持有者的相关信息,被存储在锁池中。
锁池:会话持有任意一个队列资源的信息,保存在锁池中。某一个队列资源上的等待者和持有者相关的信息,并不在队列资源池中存储,而是在锁池搁着。锁池和队列资源池中的信息合一起 称呼为一个队列资源锁.
10g队列资源池和锁池的大小:
SQL> select RESOURCE_NAME,INITIAL_ALLOCATION from v$resource_limit where resource_name='enqueue_resources';RESOURCE_NAME INITIAL_ALLOCATION-------------------- --------------------enqueue_resources 968
如上显示,10G中默认的队列资源池初始分配968个条目.每个队列资源条目在池中只占很少的信息,而一个队列资源上真正的锁信息是记录在锁池中的。
SQL> select RESOURCE_NAME,INITIAL_ALLOCATION from v$resource_limit where resource_name='enqueue_locks';RESOURCE_NAME INITIAL_ALLOCATION-------------------- --------------------enqueue_locks 2300
上图是分别在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链表来管理空闲的条目.明白了这些有关队列锁的数据结构,队列锁的获取和释放过程就非常简单了.
- 理解锁和闩(1)与锁相关的数据结构
- 数据结构-栈的相关理解和C语言基础实现
- c++时间转换与表示之03(与日期和时间相关的数据结构)
- 与数据结构相关的基本概念
- 数据结构与算法的理解
- iOS中respondsToSelector与conformsToProtocol的相关理解和使用
- iOS中respondsToSelector与conformsToProtocol的相关理解和使用
- iOS中respondsToSelector与conformsToProtocol的相关理解和使用
- iOS中respondsToSelector与conformsToProtocol的相关理解和使用
- 对 equals()方法和与equals()相关方法的理解
- 关于《《数据结构与程序设计》》的个人理解(第一章)
- 关于《《数据结构与程序设计》》的个人理解(第二章)
- 三道与数据结构相关的题目
- 数据结构的简单理解(1)
- 数组的理解与实现[数据结构]
- 链表的理解与实现[数据结构]
- 栈的理解与实现[数据结构]
- 队列的理解与实现[数据结构]
- [Android] 实现中文粗体斜体的绘制
- 我怀念的是
- 核心API最佳实践——JDK日志分级
- C#中通过WMI的Win32_QuickFixEngineering对象获取补丁信息简介
- a2ext (即 a2sd+),内存映射开启方法。
- 理解锁和闩(1)与锁相关的数据结构
- VLOOKUP 使用入门篇
- qt终端无输出
- app2ext,内存映射的纯手动设置方法。
- 简单 却爱
- (转载)jsp的session,cookie介绍
- 文件描述符和文件指针的区别
- 七夕夜、离别,涵情经河岸
- 黑盒测试用例设计方法