ENQUEUE总结笔记

ENQUEUE总结笔记[@more@]

ENQUEUE总结笔记

Oracle锁的类型

n 数据字典锁(DDL

n 数据操作锁(DML

n 内部锁和闩

n 分布式锁

n 并行缓存管理锁

队列是一个服务,是由kernel Service Enqueues (KSQ)层来提供。其他层在使用的是调用这个层的函数来使用。队列是一种用来管理共享资源联系的机制。是一个本地的能够串行连接共享资源的锁。这些共享资源可以使重做线程,表和事务。这种管理方式可以在一个实例上使用,也可以在所有的实例上实现。

在队列的使用中,有请求,转换和释放队列的使用方式和过程。如果这个队列不能立即被使用的话,客户层将选择等待或者超时。

队列标识

每一个队列都有一个唯一的名字来进行标识,这个也可以认为是锁或者资源的名字。标识由三部分构成:

Type:是一个两个字节的字符串,例如:TM

ID12:是一个4字节的正值。

不同类型的队列服务ID12是由不同的定义。这些数据可以通过查询视图v$lock来查看到:

SQL> select type,id1,id2 from v$lock;

TYPE ID1 ID2

---- ---------- ----------

MR 202 0

MR 8 0

MR 5 0

MR 4 0

MR 3 0

MR 1 0

RT 1 0

XR 4 0

TS 2 1

9 rows selected

队列模式

例如对于DML锁来说:

SS = Row Share (lock a row in shared mode)

SX = Row Exclusive (lock a row in exclusive mode)

S = Share (lock the entire table in shared mode)

SSX = Share Row Exclusive (lock the table in shared mode but a row in exclusive)

X = Exclusive (lock the entire table in exclusive mode)

SS = 行锁(在共享模式下锁一行)

SX = 行排他锁(在排他模式下锁一行)

S = 共享(在共享模式下锁一个表)

SSX = 共享行排他(在共享模式下锁一个表但是一个行是排他的)

X = 排他(整个表在排他模式下锁)

队列的兼容性

如下表所示,这里主要是为了下一步的队列的请求,转换和释放提供一个参考。

Held/Get

NULL

SS

SX

S

SSX

X

NULL

SS

SX

S

SSX

X

队列的请求,转换和释放是有会话来控制的,并不是一个进程,这一定是很好理解的,事务是在会话的基础之上的。对于每一个队列是一个资源结构,主要包含和维护着拥有者,等待,转换的一个列表。而每一个拥有者,等待,转换都有一个锁结构。

锁和资源表被分配在SGA中,在资源表中的总的行数是由初始化参数enqueue_resources来确定。这些行能够在表x$ksqrs中看到,使用的值可以查询v$resource

enqueue_resources这个参数是设置能够被锁管理器并行锁的资源的数量。

_enqueue_locks 这个参数是在队列锁表中所有行数,可以在x$ksqeq中查询到,v$enqueue_lock.

SQL> select * from x$ksqrs;

ADDR INDX INST_ID KSQRSID1 KSQRSID2 KSQRSIDT KSQRSFLG

-------- ---------- ---------- ---------- ---------- -------- ----------

7A2DDA38 0 1 1245220 8 TX 4

7A2DDA8C 1 1 0 1 IS 0

7A2DDAE0 2 1 0 0 IS 0

7A2DDB34 3 1 4 0 XR 2

7A2DDB88 4 1 0 0 CF 0

7A2DDBDC 5 1 0 4 CF 0

7A2DDC30 6 1 2033875140 2033875140 CU 0

7A2DDC84 7 1 2033703204 2033703204 CU 0

SQL> select * from v$resource;

ADDR TYPE ID1 ID2

-------- ---- ---------- ----------

7A2DDB34 XR 4 0

7A2DDD2C RT 1 0

7A2DDE28 MR 3 0

7A2DDE7C MR 5 0

7A2DE020 MR 1 0

7A2DE074 MR 4 0

7A2DE0C8 MR 8 0

7A2DE170 MR 202 0

7A2DF2A0 TA 6 9

7A2DFE80 TS 2 1

资源结构:

如上图所示:这个资源结构包含着资源名和三个连接列表,拥有列表包含对这个资源已经请求得到的锁的会话的锁结构,等待列表包含着没有在这个资源上的锁,但是正在请求的锁结构。

队列的分类

队列有两个不同的类型:

客户队列

锁结构是由客户层分配,例如DML锁(TM)。

管理队列

锁结构是由KSQ自身分配。例如:媒介恢复队列(MR

这两种队列的不同主要是锁数据结构的位置不同。管理队列一般由固定或者限制数量的锁组成。下表就是详细分类:

Client or User Enqueues

TM: DML enqueue

TX: Transaction enqueue

UL: User supplied

Managed or System Enqueues

BL: Buffer Cache Management

CF: Controlfile Transaction

CI: Cross-instance Call Invocation

CU: Bind Enqueue

DF: Datafile

DL: Direct Loader Index Creation

DM: Database Mount

DR: Distributed Recovery

DX: Distributed TX

FS: File Set

IN: Instance Number

IR: Instance Recovery

IS: Instance State

IV: Library Cache Invalidation

JQ: Job Queue

KK: Redo Log “Kick”

L[A–P]: Library Cache Lock

MR: Media Recovery

N[A–Z]: Library Cache Pin

PF: Password File

PI: Parallel Slaves

PR: Process Startup

PS: Parallel Execution Process Synchronization

Q[A–Z]: Row Cache

RT: Redo Thread

SC: System Commit Number

SM: SMON

SQ: Sequence Number Enqueue

SR: Synchronized Replication

SS: Sort Segment

ST: Space Management Transaction

SV: Sequence Number Value

TA: Transaction Recovery

TS: Temporary Segment (also TableSpace)

TT: Temporary Table

UN: User Name

US: Undo Segment, Serialization

WL: Being Written Redo Log

XA: Instance Attribute Lock

XI: Instance Registration Lock

状态对象

所有的锁结构被嵌入一个状态对象,目的是在进程失效的时候允许PMON来恢复这个锁结构。客户锁结构被嵌入客户化的状态对象,例如:

1、 DML锁(TM)结构被嵌入DML锁状态对象。

2、 事务锁结构(TX)被嵌入事务锁状态对象。

管理锁结构被嵌入了队列状态对象。

所有的资源结构组成了资源表,为了在资源表中找到相应的资源,Oracle在这里使用的是一种hash算法。就是利用资源名()来进行hash,(这里使用的是一个hash函数,这个hash函数是将资源名转换为一个索引)从而在hash块找到所要查找的资源。每一个hash bucket是有一个资源的连接列表(hash链)而组成。

这个hash链是由一个或者多个latches来维护的(enqueue hash chains的子闩),是由round-robin来分配。

锁的请求

锁的请求是在会话准备获取一个锁但是没有得到的时候发生。一个会话在一下的状态上允许得到一个锁:

1、 在这个地前面没有需要转换或者等待的

2、 这个请求的模式&现在已经获得锁的会话的模式兼容的话,就可以得到这个锁

不符合上述的话,会话请求将会在等待队列中等待

请求的详细步骤:

1、 使用hash函数来确定请求资源的连接列表的位置

2、 获得相应的enqueue hash chain

3、 定位资源,或者如果资源不存在的话,查找空闲的资源结构并将他放置在这个连接列表上。

4、 获得enqueues闩;

5、 提供空闲的锁结构;

6、 使用你所请求的资源正确的信息来组装

7、 连接锁结构到资源结构上

8、 释放enqueues

9、 释放enqueue hash chain

锁转换

锁转换发生在一个会话请求改变当前保持的状态。在下面的情况下允许转换一个锁:

1、 需要转换的状态是已经保持状态的子集模式

2、 需要转换的状态和被其他会话当前正在保持的状态兼容;

锁的释放

释放的详细步骤:

1、 使用hash函数来确定请求资源的连接列表的位置

2、 获得相应的enqueue hash chain

3、 定位资源

4、 获得enqueues

5、 解除资源上的锁结构的连接

6、 连接锁结构到锁空闲列表上

7、 释放enqueues

8、 执行下一个转换或者等待得锁结构

9、 如果可能的话将资源结构从hash链上脱离连接,将这个资源结构连接到资源空闲列表上。

10、 释放enqueue hash chain

从上面的操作来看,有这么几个数据结构:

n Hash bucket

n 资源结构

n 锁结构

相对应的有几个列表:

n Hash 列表

主要是为了连接hash bucket

n 资源结构空闲列表

这里存在这样的一个列表,可以使用资源的使用和释放,这个应该是用某一个初始化参数来决定资源的数量。在资源表中的总的行数是由初始化参数enqueue_resources来确定。这些行能够在表x$ksqrs中看到,使用的值可以查询v$resource

enqueue_resources这个参数是设置能够被锁管理器并行锁的资源的数量。

n 锁结构空闲列表

这个空闲列表示用于锁结构资源的使用&释放。_enqueue_locks 这个参数是在队列锁表中所有行数,可以在x$ksqeq中查询到,v$enqueue_lock.

队列的操作

1、 在一个新的锁被请求的时候,Oracle服务器将检查验证这个队列,看看这个请求是否被授权。

2、 当一个锁被释放或者被转换的时候,转换器和等待器也被重新检查,来看看他们是否能被请求。

3、 转换器队列首先被处理,随后是等待队列。

等待事件:enqueue

当一个会话等待一个本地队列的时候,将会找到队列等待时间的产生。我们可以通过查询视图v$session_wait来发现这个等待时间。

select event, total_waits, total_timeouts

from v$system_event

where event = 'enqueue';

调整队列等

1、调整enqueue等待事件依赖于造成等待enqueue的类型;调整enqueue等待事件很大程度上是依赖于造成等待enqueue的类型。

2、可能的解决办法为:

a 减少enqueue的请求量

例如SQ队列主要原因是由于sequence有关,如果在内存中被请求的序列有几个值得话,就可以从一定程度上缓解这种队列的产生。所以解决的方法是通过增加序列的缓存。再如ST队列实有关于字典表空间管理方式下,空间事务的请求有关,这样的解决方式就是我们可以通过将空间转换为本地管理表空间,减少冲突的产生等情况来解决。

b 减少enqueue保持的时间

例如CF队列必须是在更新控制文件时候必须被保持的状态,主要原因是有太多的控制文件的拷贝,更新他们就需要太多的保持enqueue的时间,解决的办法是减少控制文件的数目。

诊断队列的脚本:

prompt ***************************************************************************

prompt enqueue的调查和分析

prompt ***************************************************************************

prompt 建议:

prompt 1、调整enqueue等待事件依赖于造成等待enqueue的类型;

prompt 2、可能的解决办法为:

prompt a 减少enqueue的请求量

prompt b 减少enqueue保持的时间

prompt TM: DML enqueue

prompt TX: Transaction enqueue

prompt UL: User supplied

prompt

prompt BL: Buffer Cache Management

prompt CF: Controlfile Transaction

prompt CI: Cross-instance Call Invocation

prompt CU: Bind Enqueue

prompt DF: Datafile

prompt DL: Direct Loader Index Creation

prompt DM: Database Mount

prompt DR: Distributed Recovery

prompt DX: Distributed TX

prompt FS: File Set

prompt IN: Instance Number

prompt IR: Instance Recovery

prompt IS: Instance State

prompt IV: Library Cache Invalidation

prompt JQ: Job Queue

prompt KK: Redo Log “Kick”

prompt L[A–P]: Library Cache Lock

prompt MR: Media Recovery

prompt N[A–Z]: Library Cache Pin

prompt PF: Password File

prompt PI: Parallel Slaves

prompt PR: Process Startup

prompt PS: Parallel Execution Process Synchronization

prompt Q[A–Z]: Row Cache

prompt RT: Redo Thread

prompt SC: System Commit Number

prompt SM: SMON

prompt SQ: Sequence Number Enqueue

prompt SR: Synchronized Replication

prompt SS: Sort Segment

prompt ST: Space Management Transaction

prompt SV: Sequence Number Value

prompt TA: Transaction Recovery

prompt TS: Temporary Segment (also TableSpace)

prompt TT: Temporary Table

prompt UN: User Name

prompt US: Undo Segment, Serialization

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/222350/viewspace-908008/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 锁的总结笔记
user_pic_default.png
请登录后发表评论 登录
全部评论
<%=items[i].createtime%>

<%=items[i].content%>

<%if(items[i].items.items.length) { %>
<%for(var j=0;j
<%=items[i].items.items[j].createtime%> 回复

<%=items[i].items.items[j].username%>   回复   <%=items[i].items.items[j].tousername%><%=items[i].items.items[j].content%>

<%}%> <%if(items[i].items.total > 5) { %>
还有<%=items[i].items.total-5%>条评论 ) data-count=1 data-flag=true>点击查看
<%}%>
<%}%> <%}%>

转载于:http://blog.itpub.net/222350/viewspace-908008/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值