enqueue是一种保护共享资源的锁定机制。该锁定机制保护共享资源,如记录中的数据,以避免两个人在同一时间更新 同一数据。enqueue包括一个排队机制,即FIFO(先进先出)排队机制。
通常以"TYPE-ID1-ID2"格式表示一个Enqueues。其中:
"TYPE"是一个两个字符的文本字符串
"ID1"是一个4 byte的16进制数字
"ID2"是一个4 byte的16进制数字
从视图V$SESSION_WAIT可以得到这些信息。
如果一个等待事件是"enqueue"(在9i及之前,10g开始表示为enq:'enqueue内容')。那么:
P1 = Lock Type & Mode
P2 = LOCK ID1
p3 = LOCK ID2
P1字段需要转换转换为16进制数字(或者使用字段P1RAW),通过将前2 bytes(前4位)的16进制数字转换为ASCII字符,后2 bytes(后4位)的16进制数字转换为10进制数字,然后提取出锁的类型和请求模式。
例如:54580006
^^^^------ 转换为ASCII码获得 "TX" (0x54 = "T", 0x58 = "X")
^^^^-- 0006 的10进制数字是6,所以这是一个模式6请求。
以下是一个提取信息的SQL语句(适用于9i以及之前版本):
SELECT chr(to_char(bitand(p1,-16777216))/16777215)||
chr(to_char(bitand(p1, 16711680))/65535) "Lock",
to_char( bitand(p1, 65535) ) "Mode"
FROM v$session_wait
WHERE event = 'enqueue';
等待时间:
实际的等待时间依赖于锁的类型。在多数情况中,Oracle会等待直到3秒或等待获得有效地enqueue资源(无论哪种情况先发生)。当等待事件超时,Oracle将会检查那些持有lock的session,是否仍然处于活动状态,如果是,则再次等待。死锁的检测也依赖于对死锁敏感的锁。
"enqueue"的等待事件的统计中,常会误解等待次数是enqueue"沉睡又醒来"的次数。要取得实际发生了多少次等待,需要enqueue waits统计信息,可以从视图V$SYSSTAT中获得,或者从statspack或Estat报告中的"Statistics"部分获得。
例如:
在一个Oracle8i的statspack报告中,Wait Events部分显示enqueue的time_waited=3000 total_waits=10
在Statistics中显示的enqueue waits显示发生了2次。
这意味着实际发生了2次等待,这两次个体的等待事件的总等待时间是3000厘秒(约为30秒)。
通过V$LOCK视图可以查看等待者和它们的阻塞者:
SELECT DECODE(request,0,'Holder: ','Waiter: ')||sid sess,
id1, id2, lmode, request, type
FROM V$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM V$LOCK WHERE request>0)
ORDER BY id1, request;
通过视图V$SESSTAT可以查找最多"enqueue waits"次数的session:
SELECT se.SID,se.VALUE AS "Enqueue Waits" FROM V$SESSTAT se,V$SYSSTAT sy
WHERE sy.NAME='enqueue waits' AND se.STATISTIC#=sy.STATISTIC# AND se.VALUE>0
ORDER BY se.VALUE DESC;
以下简要列出锁的分类:
用户类型锁:
用户类型 说明
---------------- -----------------
TM DML 排队
TX 事务处理排队
UL 用户提供
系统类型锁:
系统类型 说明
---------------- -----------------
BL 缓冲区散列表实例
CF 控制文件模式全局排队
CI 交叉实例功能调用实例
CU 游标绑定
DF 数据文件实例
DL 直接装载程序并行索引创建
DM 安装/启动数据库主/副实例
DR 分布式恢复进程
DX 分布式事务处理项
FS 文件集
HW 特定段上的空间管理
IN 实例号
IR 实例恢复串行全局队列
IS 实例状态
IV 库高速缓存无效实例
JQ 作业队列
KK 线程突跳
LA…LP 库高速缓存锁实例锁(A…P=名称空间)
MM 安装定义全局队列
MR 介质恢复
NA…NZ 库高速缓存固定实例(A…Z=名称空间)
PF 口令文件
PI,PS 并行操作
PR 进程启动
QA…QZ 行高速缓存实例(A…Z=高速缓存)
RT 重做线程全局队列
SC 系统提交编号实例
SM SMON
SN 序列号实例
SQ 序列号队列
SS 排序段
ST 空间事务处理队列
SV 序列号值
TA 一般队列
TS 临时段队列(ID2=0)
TS 新块分配队列(ID2=1)
TT 临时表队列
UN 用户名
US 撤消段DDL
WL 开始写重做日时局实例
阅读(721) | 评论(0) | 转发(0) |