从Oracle8开始,DLM数据库(存储有关资源,锁,进程的信息)已集成在Oracle SGA中。DLM内存区用于存储所有锁相关的master节点。DLM不提供锁定资源的能力,但是它会将资源提供为可锁定实体。在Oracle8i中,主节点与目录节点是固定的这对锁资源申请访问并不友好。从Oracle9i开始,这种固定的对应方式被取代,Oralce使用动态remaster技术,通过lookup表运用hash算法将换算后的master key与实际的master做一一对应。

资源:应用程序访问的任何对象

客户端:任何要求资源的进程

锁:客户端对资源的意图

DLM服务:允许客户端应用程序创建,修改和删除共享的锁。

DLM数据库:存储有关资源,锁,进程的信息

资源在Oracle中定义为(程序访问的任何对象)。每个资源都需要有当前授予的用户锁列表,此列表称为Grant Q。此外还有相对应的Convert Q,即等待转换的锁队列。此外,有些资源拥有用于存储少量锁定值的块(LVB),一般16字节。例如,并行查询子进程在申请的PS资源(Parallel SlaveSynchronization)的时候使用它存储kxfpqd结构传递给其他节点。这两种资源类型具有不同的数据结构。客户端(用户)必须锁定资源才能使用它所代表的内容。

资源类型与数据结构的对应:

• Enqueues:锁定非PCM资源

• lock Elements:锁定PCM资源

如果Oracle进程没有遵循“使用前锁定”规则,那么这个系统就会乱套。它可能在一段时间内不会显示为系统或数据损坏。

当进程锁定资源的授权队列时,它被称为“拥有”资源。下图显示了对资源的Grant Q的锁定。锁可以是进程或组拥有的。进程拥有的情况下,则PID字段显示进程号。组拥有锁的情况下,GID字段表示为组号,DID字段表示为客户端事务的XID(TxID)。



在一个简单的实现中,DLM为进程提供锁定。这在维护进程到会话映射时工作正常。但是,在MTS(共享服务器)和XA(分布式)场景下,会话可能会涉及迁移,或者多个进程完成一个事务。这时候提供基于会话的标识符来控制对锁的访问是非常明智的选择,这就是组锁定引入的缘由。通常,Oracle提供事务XID作为组ID,然后处理该事务的任何进程都只提供XID和锁定操作即可。




影子资源

• 主节点具有所有资源信息,例如完全授权队列和转换队列。

• 影子资源存在于对此资源感兴趣(申请锁定)的任何其他节点上,但它只知道自己本地节点上的锁。



影子资源存在于对资源感兴趣的任何其他节点上,即对该资源打开锁定的任何节点。

在主节点以外的节点上保持锁定时,主节点会在本地保留锁定的副本。资源感兴趣的每个节点都只有一个锁的副本。复制锁保存在主节点上,这是主节点所必需的信息。其他信息每个节点可以根据自己所需进行维护。主节点具有主锁,本地节点具有影子锁。



基础资源结构及资源管理

GRD(DLM)维护资源的所有节点上的锁的信息。锁master分布在集群中的所有节点上。主节点包含资源的描述以及资源上持有最高锁定模式的锁信息。Oracle根据资源名称通过使用数组来计算资源的主节点:res_hash_val_kjga(对于非PCM资源)和pcm_hv_kjga(对于PCM资源)。它选择一个节点来管理资源的相关信息和在资源上的锁信息,这种节点称为资源的主节点。当节点加入或离开集群时,重构阶段Oracle会以最小化资源迁移更新res_hash_val_kjga和pcm_hv_kjga数组。每个数组都包含一个bucket包含物理节点号。对于非PCM资源,Oracle对资源名称进行Hash以获取存储桶编号bidx,然后使用res_hash_val_kjga [bidx]确定资源的主节点编号,集群中的每个节点的数组都是私有化的。

• resource name:用于标识的唯一名称资源,Value Block:内存中用于存储有关资源信息的区域。

• Granted Queue:在资源上授予锁。

• Convert Queue:锁在从一种模式转换为另一种模式。

• 每个非PCM资源在集群中通过名称进行标识,名称”由3个4字节的整数组成(ub4 n[3])。

• Non-PCM:名称由3个4字节的整数组成(ub4 n[3])。n [0]设置为id1,n [1]设置为id2,n [3]接收字符串值(例如“DI”或“LB”)。

• PCM:由具有两个整数的名称标识,具有第三个整数字符对为“BL”。






沃趣科技,让客户用上更好的数据库技术!