ITPub博客

首页 > 数据库 > Oracle > 资源、锁和队列的概念和观察

资源、锁和队列的概念和观察

原创 Oracle 作者:cdddata 时间:2017-06-19 08:27:54 0 删除 编辑
一、共享资源和锁
共享资源:可被多个进程和会话来访问的资源,因此需要被保护。Oracle中,除了PGA锁内存外,通常都是共享资源。
锁:是数据库用来控制共享资源并发访问的机制,主要为了保护会话层面的一些资源。简单来讲,锁是用来保护和用户相关的资源,如:表、用户、会话等。以TM锁为例,当我们对某个表做DML操作时,需要先获得TM队列锁。与底层锁相比,高级队列锁的实现要复杂很多,高级队列锁和获取和释放速度也没有底层锁快,例如TM锁,如果用户DML操作不去提交,那么锁就不会被释放。

二、队列标识
当多个进程或会话指向一个表进行(或共享资源)操作时,就需要排队,这就是队列的作用。
队列标识:如果有100张表被DML操作,那就会有100个TM锁,为了加以区分,标识的格式是‘队列名(锁名)-ID1-ID2’,第一部分代表锁的类型;中间部分代表锁指向(锁定)的对象号,通常是表名;最后一部分因锁类型的不同而不同;这三部分共同构成了队列锁的队列标识;
如TM-00015b46-00000000,代表是TM队列锁,锁定了00015b46对象(对应dba_objects中的object_name、object_id),这些信息可以在V$LOCK视图中可以查到,对应的是TY-ID1-ID2。
三、资源结构
上面提到,如果数据库有100张表,就要对应100个TM队列锁。但只有具体要操作某张表,才会去建立相关的队列信息,比如会话中update了AA表,就在SGA中建立了相关的TM队列信息,这个称为资源结构
每一个资源结构都分为三部分,持有者队列owners,等待者队列Waiters,转换者队列Converters,如下图:

图中TM-432-0即是队列标识,也可以作为资源结构标识。
每一个所有者、等待者和转换者都会有一个锁结构,这是一个链表,由会话,锁模式等信息构成的,具体描述了以什么会话什么模式获得此资源结构
1.持有者队列owners:会话已经获得锁;
2.等待者队列Waiters:会话正在等待锁;
3.转换者队列Converters:会话已获得锁,但锁有冲突,需要等待转换锁模式


四、队列资源池和锁池
池:池是计算机经常用到的术语,指一块固定大小的内存。在SGA里与锁相关的内存区有两块,分别称为队列资源池和锁池。

所有资源结构组成一个资源表,资源表(队列资源池?)和资源结构上的锁池都被分配在SGA中。可以以v$resource_limit中看到队列资源结构池的数量的限制和使用情况:
SQL> select * from v$resource_limit where resource_name = 'enqueue_resources';
RESOURCE_NAME       CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION    LIMIT_VALUE
------------------------------ ------------------- --------------- ---------------------------------------- ----------------------------------------
enqueue_resources 21 52 1328     UNLIMITED
可以看到,当前使用了21个资源结构,最多时使用了21个资源结构,初始化参数中分配了1328个资源结构。最多使用是UNLIMITED,表示没有限制。
每个队列条目在池中字占了很少的信息,其中主要包括队列资源名,持有者队列owners,等待者队列Waiters,转换者队列Converters等信息,在队列资源池中,只记录了这三种队列的头地址,而一个队列上真正的锁信息是记录在锁池上的。例如,两个会话修改了同一表的不同行,这样会有个新的队列资源被占用,名字,它会有两个持有者,这时队列资源池中会有一个空闲条目被占用,其信息包括队列资源名和持有者队列的链表头,但真正的两个持有者的相关信息是被存储到锁池中。

如下命令可以显示锁池的大小。
SQL> select * from v$resource_limit where resource_name='enqueue_locks';
RESOURCE_NAME       CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION    LIMIT_VALUE
------------------------------ ------------------- --------------- ---------------------------------------- ----------------------------------------
enqueue_locks 21 38 3280  3280

锁池:会话持有的任意一个队列资源信息,都保存在锁池中,就像上面提到的例子一样;而队列资源信息保存在队列资源池中;队列资源信息和锁池中的各会话持有或等待某资源的信息,合称为队列锁,


四、资源结构哈希表
Oracle如何找到队列锁的资源结构呢?答案还是使用Hash算法

上图是HASH Bucket和资源结构的图,和Shared pool中的Library cache中的很像,其实,Oracle中只要涉及Hash,其原理都是一样的。



以上为队列、资源结构和锁结构的关系。可以做以下实验来证明:
Session 1_SQL> insert into text values(1,2);
Session 2_SQL> insert into text values(2,2);
SQL> select * from v$resource where type ='TM';
ADDR TY   ID1      ID2
---------------- -- ---------- ----------
00000000BEE1C1D0 TM 88956 0

可以看到有一个TM队列锁,地址为BEE1C1D0,88956即指向text表,可用以下方法验证:
SQL> select object_name from dba_objects where object_id=88956;

OBJECT_NAME
----------------------------------------
TEXT

查看V$lock视图
SQL> select * from v$lock where id1=88956;

ADDR KADDR SID TY        ID1  ID2   LMODE    REQUEST CTIME    BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
00007F54354D22A0 00007F54354D2300 175 TM      88956    0       3  0    25 0
00007F54354D22A0 00007F54354D2300  45 TM      88956    0       3  0   484 0

可见,TM-88956-0是3号锁,由两个会话持有

五、观察队列结构
我们可以用这条语句Dump出队列结构详细信息
alter session set events 'immediate trace name enqueues level 4';
SQL> create table aaa(id int,text varchar2(20));

Table created.

SQL> insert into aaa values(1,'aa');

1 row created.

SQL> alter session set events 'immediate trace name enqueues level 4';

Session altered.

[oracle@localhost trace]$ more orcl_ora_23617.trc
*** 2017-06-09 22:49:41.117
===================================================
ENQUEUES   表示队列信息
--------
 
Active:    lock: (nil), resource: (nil)
Global:    name: ORCL
Hash:      length: 539, at: 0xbee3d470
Hash表:这里有两个值,一个指向列表开头,一个指向列表结尾;如果两个值相等,那么就说明只有1个。
           [bee3d470,bee3d470]  [bee3d4a0,bee3d4a0]  [bee3d4d0,bee3d4d0]  
           [bee3d500,bee3d500]  [bee3d530,bee3d530]  [bee3d560,bee3d560]  
           [bee3d590,bee3d590]  [bee3d5c0,bee3d5c0]  [bee3d5f0,bee3d5f0]  
           [bee3d620,bee3d620]  [bee3d650,bee3d650]  [bee3d680,bee3d680]  
           [bee3d6b0,bee3d6b0]  [bee3d6e0,bee3d6e0]  [bee118b0,bee118b0]  
           [bee3d740,bee3d740]  [bee3d770,bee3d770]  [bee3d7a0,bee3d7a0]  
           [bee3d7d0,bee3d7d0]  [bee3d800,bee3d800]  [bee3d830,bee3d830]  
           [bee3d860,bee3d860]  [bee3d890,bee3d890]  [bee3d8c0,bee3d8c0]  
           [bee3d8f0,bee3d8f0]  [bee3d920,bee3d920]  [bee3d950,bee3d950]  
           [bee3d980,bee3d980]  [bee3d9b0,bee3d9b0]  [bee3d9e0,bee3d9e0]  
           [bee3da10,bee3da10]  [bee3da40,bee3da40]  [bee3da70,bee3da70]  
           [bee3daa0,bee3daa0]  [bee3dad0,bee3dad0]  [bee3db00,bee3db00]  
           [bee3db30,bee3db30]  [bee3db60,bee3db60]  [首指针bee11938,bee11938尾指针]  
略过.........           (  [bee3db30,bee3db30] 即hash表中记载的队列锁在资源队列池中的地址)
-------------------------------------------------------------------------

中间很多锁,略过

-------------------------------------------------------------------------
TM-00015b0e-00000000    队列标识,标识TM锁,指向表aaa(00015b0e是16进制,转换成10进制为88846,即对应表aaa的object_id)
 
res: 0xbee1da88 , flags: (0x6) ALO/-/USR/-/-/-  这里开始描述资源结构
  held counts: NULL=0 , SS=0 , SX=1 , S=0 , SSX=0 , X=0 (bmask: 0x8)    描述锁的级别
  lock value: 00000000 00000000 00000000 00000000
  htb(0xbee1da88): [bee435f0,bee435f0]
  own(0xbee1da98): [bbe33318,bbe33318]  持有者队列信息
  cnv(0xbee1dab8): [bee1dab8,bee1dab8]   转换者队列信息
  wtr(0xbee1daa8): [bee1daa8,bee1daa8]    等待者队列信息
 
lock summary:
  OWN: L1:SX   持有者队列信息
  CNV:              转换者队列信息
  WTR:             等待者队列信息 
# of incomp w/ SS converters: 0 
  # of incomp w/ SS waiters: 0 
 
lock details:      描述锁的详细信息
 
  lock                     lst hold wait   sid:ser   owner      link
  -------------------------------------------------------------------------
    L1: 0xbbe33308 OWN   SX   --    45:3     0xbe6caab0 [bee1da98,bee1da98] 这里一般都会指向下一个,一样的原因是当前只有一个



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

请登录后发表评论 登录
全部评论

注册时间:2017-06-12

  • 博文量
    7
  • 访问量
    9130