全部博文(60)
分类: Oracle
2011-02-14 21:26:37
² 识别与enqueue相关的内部资源和结构
² 解释enqueue的获取、转换、释放的这个过程
² 描述怎样调整enqueue的等待
² 解释enqueue的诊断信息
锁的类型Oracle 的lock分成以下几种类型:
² DDL Lock ( Data Dictionary Lock )
ü Row Cache Locks
ü Library Cache Locks and pins
² DML Lock (Data Manipulation Lock)
ü Row Lock (TX)
ü Table Lock (TM)
² Internal locks and latches
² Distributed Locks
² PCM Locks (Parallel Cache Management)
Oracle服务器使用不同类型的锁来控制并发访问数据并阻止用户之间相互破坏数据,通过它的操作,Oracle服务器能够自动在不同的限制级别(如:Shared、Sub-Shared、Exclusive、Sub-Exclusive、Sub-Shared-Exclusive等等)获取不同类型的锁(如: TX 或TM),这个依赖于被锁住的资源和在其上的操作。
DDL Lock 用于保护数据的定义在访问期间不被其他用户修改,如Table的结构,View、PL/SQL代码等等。
DML Lock用于保护Table中的数据,可以锁住整个Table,也可以锁住被选择的行,这样保证数据不会被不同的用户同时修改。
Internal locks and latches:用于保护数据库内部的结构,如:数据文件、表空间、回滚段等等。
Distributed Lock用于保护分布式的环境中(如:RAC)的数据和其他资源。
PCM Lock用于RAC环境中保持不同节点上的Buffer Cache的一致性。
那么这些锁是怎么实现的呢?OK,在Oracle的代码中,Oracle使用KSQ(Kernel Service Enqueues)和KSL(Kernel Service Latches)两个内核层来实现这些Lock。本章只讲述Enqueue相关的内容,Latch相关的内容将在下一章(Latch Internals)中讨论。Distributed Lock和PCM Lock的内容可以参考DSI408: Real Application Cluster,本章也不做讨论。
下面我们先来看看什么是Enqueue呢?
Enqueues
² Enqueues是Kernel Service Enqueues (KSQ)层提供的一个服务;
² 其他层可以调用这一层提供的服务,有点类似于IOS七层参考模型;
² Enqueues是管理共享资源的一种锁定机制(Locking Mechanism);
² Enqueues可以是在单个Instance上,也可以跨越多个Instance;
² 有一个用来获取(Acquire)、转换(Convert)、释放(Release) Enqueues的接口;
² 如果请求的enqueue不能获得,那么客户端可以选择不确定的等待或者是等待超时;
Enqueues是用来串行化访问共享资源的Lock,这个Lock是一个本地的Lock,那么什么是共享资源呢?如一个redo 线程,一个Table等。
在单个Instance的环境中,任何enqueue的范围都只限制在那个Instacne上。在RAC环境中,enqueue仍然是一个本地的enqueue,但是它也是一个global的enqueue,它跨越数据库中的所有instance,例如space management enqueue(ST)就是一个global enqueue。在任一个给定的时间,仅有一个session可以跨越RAC数据库中的所有instance来执行数据库字典空间的管理(即数据库字典部分所用的空间的管理),(如果表空间是本地管理的表空间则不需要ST enqueue)。获取一个enqueue就是首次在一个资源上获得一个lock。转换一个enqueue是从一种模式换到另外一种模式(如SàX)的一个处理过程。释放一个enqueue是从lock 状态切换到no-lock状态。
如果不能立即获得一个lock,则Enqueue 所服务的客户端层(即KSQ的上层)会等待。当它们(即KSQ的上层)发出“get”调用时,它们可以选择不确定的等待或者是timeout了一个预定的时间。
在数据库内部Enqueue又是怎么表示的呢?下面我们来看看enqueue标识符:
Enqueue Indetifiers² 每一个enqueue都可以被一个唯一的名字来标识,也被称为“锁名字”或者“资源名字”
²
这个标识符的形式是
ü Type是一个占两个字符的字符串,如:TM
ü ID1,ID2是一个正数(占4 bytes)
Enqueue标识符被强制标识成
Type、ID1、ID2的值可以在v$lock中看到。
下面我们来讲一下Enqueue的模式有哪些:
Mode |
Internal ID |
Value |
Description |
NULL |
KSQMNULL |
1 |
Null |
SS |
KSQMSS |
2 |
Sub-Share |
SX |
KSQMSX |
3 |
Sub-excusive |
S |
KSQMS |
4 |
Share |
SSX |
KSQMSSX |
5 |
Sub-Share-Exclusive |
X |
KSQMX |
6 |
Exclusive |
Enqueue 模式或者是lock 模式它们自身没有任何真实的意思,模式的真实意思是由使用它们的子系统来指示的。例如,Transaction层使用enqueue系统来实现DML Lock。
各种模式的意思如下:
SS = Row Share 或者是Sub-Share,意思就是共享锁住其中对象的一部分,而不是全部,这样其他用户就可以以SX的方式访问对象,如果是共享锁住整个对象那么用户就不能SX访问对象了,这样就会提高了对象的并发访问。
SX = Row Exclusive 或者是Sub-Exclusive,独占锁住对象的一部分,同时允许其他用户共享访问该对象(可以以SS,SX的模式来访问)。
S = Share 共享锁住整个对象,其他用户可以共享访问该对象,但是不允许修改该对象。
SSX = Share Row Exclusive 共享锁住整个对象,同时独占锁住一部分,允许其他用户以SS的模式访问该对象
X = Exclusive 独占访问整个对象,不允许其他用户访问和修改
NULL,null模式的所有什么用处呢?简单地说就是通知一个对象无效了!