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就需要等待。