Oracle锁大类

1.DML锁 (SELECT, INSERT, UPDATE, DELETE, MERGE是对数据库加的锁, 可能是行锁,也可能是表锁)

2.DDL锁 (Create, Alter时对数据库加的锁, 保护对象结构定义)

3.内部锁和闩latch

 

DML锁

TX锁(事物锁), 事物开始时持有这个锁,知道事物提交或回滚。

注意:Oracle锁不会对系统带来更多的开销,原因是Oralce没有一个传统的锁管理器。

 

通过查询V$transaction, v$session, v$lock可以得到当前事物,会话和被锁定的表。实验可以通过打开两个sqlplus 回话,然后update同一行数据,然后查看这几个dynamic view.

v$transacion 对应每个活动transction对应一行

v$session, 显示已经登录的会话

v$lock, 对于持有所有enqueue队列锁和正在等待锁的会话,都包含一条。

 

通过查询这几个视图,可以看到系统的状态

select username,
v$lock.sid,
trunc(id1/power(2,16)) rbs,
bitand(id1,to_number('ffff','xxxx'))+0 slot,
id2 seq,
lmode,
request
from v$lock, v$session
where v$lock.type = 'TX'
and v$lock.sid = v$session.sid
and v$session.username = USER;

例子结果

USERNAME         SID        RBS       SLOT        SEQ      LMODE    REQUEST
--------- ---------- ---------- ---------- ---------- ---------- ----------
OPS$TKYTE        703          2         26       8297          6          0

 

select XIDUSN, XIDSLOT, XIDSQN  from v$transaction;
 
    XIDUSN    XIDSLOT     XIDSQN
---------- ---------- ----------
         2         26       8297

 

对返回结果的一些说明

v$lock.LMODE=6表示是一个排他锁,REQUEST=0表示已经持有这个锁。

v$lock不是一个锁表,比如对于一个更新4行的update语句,锁定了4行,你不会在v$lock表中找到4行条目,而只有一行。

RBS, SLOT, SEQ值与v$transaction中信息匹配。

ID1, ID2做了一些处理。

 

INITRANS, MASTRANS

我们一开始锁oracle的锁不会带来额外开销,数据本身管理锁定和事物信息。这些锁和事物信息和数据一起存储在块中一开始一段中,叫事物表,这里说一下这个块开销。 在创建表的时候,有两个参数决定了这个事物表的大小, 他们是INITRANS, MAXTRANS

INITRANS, 这个结构的初始大小,对于索引和表,default=2

MAXTRANS, 这个结构的最大大小,default=255。

如果块上有很多行数据,那么并发修改这个块上的数据的事物数就会受到限制,多出的修改transaction就需要等待。