Oracle Study之--Oracle等待事件(6)

来源:互联网 发布:淘宝网店策划书怎么写 编辑:程序博客网 时间:2024/06/02 04:01

Oracle Study之--Oracle等待事件(6)

什么是enqueue

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

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

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

什么是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 enqueue resources exceeded"

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

什么是enqueue lock

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

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

什么是enqueue hash

通过上面关于enqueue resource的描述,我们可以知道,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

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

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

alter session set events ’immediate trace name enqueues level 3’;

Enqueue

Enqueue 这个词其实是lock 的另一种描述语。

当我们在AWR 报告中发现长时间的enqueue 等待事件时,说明数据库中出现了阻塞和等待,可以关联AWR报告中的enqueue activity部分来确定是哪一种锁定出现了长时间等待。

这个等待事件有2个参数:

Name: enqueue 的名称和类型。

Mode: enqueue的模式。


可以使用如下SQL 查看当前会话等待的enqueue名称和类型

SELECT event,  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 like 'enq%';

Oracle 的enqueue 包含以下模式:

模式代码               解释1                      Null (NULL)2                      Row-S(SS)3                      Row-X(SX)4                      Share(S)5                      S/Row-X(SSX)6                      Exclusive(X)

Oracle的enqueue 有如下类型:

Enqueue 缩写      缩写解释BL                Buffer Cache managementBR                Backup/RestoreCF                Controlfile transactionCI                Cross-instance Call InvocationCU                Bind EnqueueDF                DatafileDL                Direct Loader Index CreationDM                Database MountDR                Distributed Recovery ProcessDX                Dirstributed TransactionFP                File ObjectFS                File SetHW                High-water LockIN                Instance NumberIR                Instance RecoveryIS                Instance StateIV                Library Cache InvalidationJI                Enqueue used during AJV snapshot refreshJQ                Job QueueKK                Redo Log “Kick”KO                Multiple Object CheckpointL[A-p]            Library Cache LockLS                Log start or switchMM                Mount DefinitionMR                Media recoveryN[A-Z]            Library Cache binPE                Alter system set parameter =valuePF                Password filePI                Parallel slavesPR                Process startupParallel slave synchronizationQ[A-Z]        Row CacheRO            Object ReuseRT            Redo ThreadRW            Row WaitSC            System Commit NumberSM            SMONSequence NumberSQ            Sequence Number EnqueueSR            Synchronized replicationSort segmentST            Space management transactionSV            Sequence number ValueTA            Transaction recoveryTC            Thread CheckpointTE            Extend TableTM            DML enqueueTO            Temporary Table Object EnqueueTS            Temporary Segement(also TableSpace)TT            Temporary TableTX            TransactionUL            User-defined LocksUN            User nameUS            Undo segment, SerializationWL            Being Written Redo LogXA            Instance Attribute LogXI             Instance Registration Lock

案例分析:

12:54:01 SYS@ prod>conn scott/tigerConnected.12:54:05 SCOTT@ prod>select * from tab;TNAME                          TABTYPE  CLUSTERID------------------------------ ------- ----------BONUS                          TABLEDEPT                           TABLEDEPT1                          TABLEEMP                            TABLESALGRADE                       TABLET1                             TABLE6 rows selected.12:54:09 SCOTT@ prod>grant all on dept1 to tom;Grant succeeded.Elapsed: 00:00:00.3712:54:23 SCOTT@ prod>update dept1 set dname='beijing' where deptno=10;2 rows updated.Elapsed: 00:00:00.0412:54:41 SCOTT@ prod>rollback;Rollback complete.Elapsed: 00:00:00.0312:55:22 SCOTT@ prod>update dept1 set dname='NetWork' where deptno=10;2 rows updated.Elapsed: 00:00:00.0212:54:51 SYS@ prod>conn tom/tomConnected.12:54:56 TOM@ prod>update scott.dept1 set loc='hongkong' where deptno=10;12:59:18 SYS@ prod>col event for a5012:59:26 SYS@ prod>r  1  SELECT event,  CHR (TO_CHAR (BITAND (p1, -16777216)) / 16777215)  2           || CHR (TO_CHAR (BITAND (p1, 16711680)) / 65535)  3              "Lock",  4           TO_CHAR (BITAND (p1, 65535)) "Mode"  5    FROM   v$session_wait  6*  WHERE   event like 'enq%'EVENT                                              Lock Mode-------------------------------------------------- ---- ----------------------------------enq: TX - row lock contention                      TX   6Elapsed: 00:00:00.0113:22:48 SYS@ prod>select a.ORACLE_USERNAME,a.SESSION_ID,b.TYPE,b.LMODE,b.REQUEST,b.block,o.object_name from v$locked_object a,v$lock b,dba_objects o  2*  where a.session_id=b.sid and a.object_id=o.object_idORACLE_USERNAME                SESSION_ID TY      LMODE    REQUEST      BLOCK OBJECT_NAM------------------------------ ---------- -- ---------- ---------- ---------- ----------SCOTT                                  42 TX          6          0          1 DEPT1TOM                                    38 TM          3          0          0 DEPT1SCOTT                                  42 TM          3          0          0 DEPT1TOM                                    38 TX          0          6          0 DEPT1TOM                                    38 AE          4          0          0 DEPT1SCOTT                                  42 AE          4          0          0 DEPT16 rows selected.


本文出自 “天涯客的blog” 博客,请务必保留此出处http://tiany.blog.51cto.com/513694/1537073

0 0
原创粉丝点击