Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1143322
  • 博文数量: 231
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 2662
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-03 16:35
个人简介

学无止境

文章分类

全部博文(231)

文章存档

2014年(7)

2013年(103)

2011年(11)

2010年(53)

2009年(57)

分类: Oracle

2010-01-14 19:24:07

  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                   开始写重做日时局实例   
阅读(716) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~