Enqueue block

什么是enqueue

enqueue可以做名词,也可以做动词来解释。做名词时,指的的是一种锁的类型,比如Tx enqueue。做动词时,则是指将锁请求放入到请求队列的操作。

 

我们知道,lock是一种需要排队的锁实现机制,这和latch是不一样的,latch是一种轻量级的锁,是不需要排队得。Enqueue 就是lock的排队机制的实现。

 

lock是用来实现对于共享资源的并发访问的。如果两个session请求的lock是兼容的,则可以同时锁定资源,如果两个session 请求的lock是不兼容的,则其中一个session必须等待另外一个 session释放其持有的lock后,才能获得对共享资源的锁定。这时,等待的session的lock请求就需要进入到一个队列当中,这就是enqueue等待。

 

Enqueue的模式

 enqueue(lock)一共有六种模式:

1 NULL

2 SS

3 SX

4 S

5 SSX

6 X

什么是enqueue resource

Lock有三种可能的状态:已获得,转换或者等待。对于某一个lock,可能一些session已经获得该lock,某些session请求转换,也有某些session在请求持有但无法成功而导致等待。所以,对于一个lock,需要三个队列来描述这些session的状态。这个三个队列,分别称为Owner,waiter和convert队列,由一个结构来管理,就是enqueue resource。

 

enqueue是有名字的,其名字就是对应的lock的类型加上 ID1,ID2参数构成,形如<TYPE-ID1-ID2>。Enqueue resource的结构,其头部是该enqueue的名字,然后就是指向三个队列的指针。

 

通过v$resource视图可以查看当前系统中的enqueue。

 

由于系统中有很多类型的lock同时存在,那么enqueue resource结构实际上是一个数组,其长度由隐含参数_enqueue_resources控制,也就是说,该参数控制了系统中可同时存在的lock的数量。如果超过,则会报以下错误:

ORA-00052: "maximum number of enqueueresources exceeded"

通过v$resource_limit视图可以查看系统中各种资源的利用情况。


什么是enqueue lock

 

enqueue lock就是lock本身。oracle使用了和enqueue reouserce分离的另外一个数组来管理enqueue lock,这个数组的长度由隐含参数_enqueue_locks控制。

 

通过视图v$enqueue_lock可以查看该数组中的具体内容。

 

什么是enqueue hash

 

通过上面关于enqueueresource的描述,我们可以知道,oracle查找一个lock时,需要先在enqueue resource数上查找到该lock的位置。

 

如果每次都在数组上顺序查找,显然效率较低。我们知道hash是一种高效的查找算法,所以oracle对于enqueue resource的查找也采用了hash方式,引入了一个hash数组,其大小由隐含参数_enqueue_hash控制。

 

通过对enqueue的名字<TYPE-ID1-ID2>进行 hash计算,得到的结果就是某个enqueue resource在 hash数组中的位置,也就是定位到了具体的hash bucket。如果多个enqueue resource的hash值相同,则在同一个bucket中形成一个链表。

 

相应的,为了保护这个hash数组,需要引入一个 latch:enqueue hash chain。该latch有若干个子latch,由隐含参数_enqueue_hash_chain_latches控制

 

什么是enqueue freelist

 

同样的,对于enqueueresource数组中的空闲位置,需要通过一个freelist列表来管理,这样每次在请求新的位置时,不至于要扫描整个数组。enqueue freelist由enqueues latch的保护。

 

实际上,enqueueresource的Hash管理方式,和buffer cache/library cache的管理方式非常的相像。如果想更深入的了解enqueuehash,resource和lock,可以dump出具体的结果看看:

 

alter session set events ’immediate tracename enqueues level 3’;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章