Oracle 10g enq:TX - contention等待事件(二)

2014-11-24 17:56:18 · 作者: · 浏览: 1
session_wait中的p2,p3完全一致,都是表示某个事务的。
SQL> select sid,event,p1,p2,p3 from v$session_wait where sid=148;
SID EVENT P1 P2 P3
------- ---------------------------------------------------------------- ---------- ---------- ----------
148 enq: TX - contention 1415053316 65563 166
2、查看事务(ID1,ID2)使用锁的情况
SQL> select sid,trunc(id1/power(2,16)) rbs,bitand(id1,to_number('ffff','xxxx'))+0 slot,id2 seq,lmode,request
from v$lock where type='TX' and id1=&id1 and id2=&id2;
输入 id1 的值: 65563
输入 id2 的值: 166
原值 2: from v$lock where type='TX' and id1=&id1 and id2=&id2
新值 2: from v$lock where type='TX' and id1=65563 and id2=166
SID RBS SLOT SEQ LMODE REQUEST
------- ---------- ---------- ---------- ---------- ----------
148 1 27 166 0 4
145 1 27 166 6 0
这里可以看到148在请求share型事务锁,而145持有exclusive型事务锁,因此造成了session 2的等待。
RAC情况:与单实例的情况类似
在node 1上执行session:
SQL> conn test/test
Connected.
SQL> select sid from v$mystat where rownum < 2;
SID
----------
617
SQL> insert into info values (1);
1 row created.
不提交

在node 2上执行session:
SQL> alter tablespace test read only;
出现等待。
在任意node上执行:
SQL> select c.inst_id,c.sid
from gv$session_wait a,gv$transaction b, gv$session c
where a.event='enq: TX - contention'
and trunc(a.p2/power(2,16)) = b.xidusn
and (bitand(a.p2,to_number('ffff','xxxx'))+0) = b.xidslot
and a.p3 = b.xidsqn
and c.taddr = b.addr;
INST_ID SID
---------- ----------
1 617







Enqueue (队列等待):
Enqueue是一种保护共享资源的锁定机制。该锁定机制保护共享资源,以避免因并发操作而损坏数据,比如通过锁定保护一行记录,避免多个用户同时更新。Enqueue采用排队机制,即FIFO(先进先出)来控制资源的使用。


从Oracle 10g开始,Oracle对于队列等待进行了细分,v$event_name视图中可以查询这些细分后的等待事件,简要摘录几个示例如下:


sys@CCDB> select name,wait_class
2 from v$event_name
3 where name like '%enq%';
NAME WAIT_CLASS
------------------------------------- ------------------------
enq: PW - flush prewarm buffers Application
enq: RO - contention Application
enq: RO - fast object reuse Application
enq: KO - fast object checkpoint Application
enq: TM - contention Application
enq: ST - contention Configuration
enq: TX - row lock contention Application
enq: TX - allocate ITL entry Configuration
enq: TX - index contention Concurrency
enq: TW - contention Administrative
enq: HW - contention Configuration
......


Oracle 的锁按照类型可以分为排他锁(Exclusive,缩写为X)与共享锁(Share,缩写为S),或者是两者的组合锁。排他锁(X)也被称为独占锁,在排他锁释放之前,一个对象上不能施加任何其他类型的锁定;而共享锁(S)在释放之前,对象上还可以继续加其他类型的共享锁,但是不能加排他锁。


如果按照事务的类型划分,又可以将锁定划分为DML锁,DDL锁以及内存锁(也即通常所说的Latch)。Oracle在数据库内部用Enqueue等待来记录锁定,通过Latch Free等待事件来记录闩。Enqueue等待常见的有ST、HW、TX、TM等,下面择要进行介绍。


1. 最重要的锁定:TM与TX锁
对于数据库来说,最常见的锁定类型是TM以及TX锁定。


TX锁通常被称为事务锁,当一个事务开始时,如执行INSERT/DELETE/UPDATE/MERGE等操作或者使用SELECT ... FOR UPDATE语句进行查询时,会首先获取事务锁,直到该事务结束。Oracle的TX锁定是在行级获得的,每个数据行上都存在一个锁定位(1b-Lock Byte),用于判断该记录是否被锁定,同时在每个数据块的头部(Header)存在一个ITL的数据结构,用于记录事务信息等,当需要修改数据时,首先需要获得回滚段空间用于存储前镜像信息,然后这个事务信息同样被记录在ITL上,通过ITL可以将回滚信息和数据块关联起来,所以说Oracle的行级锁定是在数据块上获得的,