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/,如需转载,请注明出处,否则将追究法律责任。
上一篇:
DELETE大批量数据的性能优化
下一篇:
锁的总结笔记
请登录后发表评论
登录
全部评论
<%=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%>
还有<%=items[i].items.total-5%>条评论
) data-count=1 data-flag=true>点击查看
<%}%>
最新文章
|
转载于:http://blog.itpub.net/222350/viewspace-908008/