Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92488292
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-11 10:13:32

  来源:赛迪网    作者:Alice

这样我们又可以引入一种新的锁的类型

共享意向排它锁(Shared Intent Exclusive Lock,简称 SIX 锁) :如果对一个数据库对象

加 SIX 锁,表示对它加 S 锁,再加 IX 锁,即 SIX=S+IX。例如:事务对某个表加 SIX 锁,

则表示该事务要读整个表(所以要对该表加S 锁),同时会更新个别行(所以要对该表加 IX

锁)。

这样数据库对象上所加的锁类型就可能有5 种:即S、X、IS、IX、SIX。

具有意向锁的多粒度封锁方法中任意事务 T 要对一个数据库对象加锁,必须先对它的

上层结点加意向锁。申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次

序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。

2.2.3 Oracle 的 TM 锁(表级锁)

Oracle的 DML锁(数据锁)正是采用了上面提到的多粒度封锁方法,其行级锁虽然只

有一种(即X锁),但其 TM锁(表级锁)类型共有5种,分别称为共享锁(S锁)、排它锁

(X 锁)、行级共享锁(RS 锁)、行级排它锁(RX 锁)、共享行级排它锁(SRX 锁),与上面提到的S、X、IS、IX、SIX 相对应。需要注意的是,由于Oracle在行级只提供X锁,所

以与RS锁(通过SELECT … FOR UPDATE语句获得)对应的行级锁也是X锁(但是该行

数据实际上还没有被修改),这与理论上的IS 锁是有区别的。

下表为Oracle数据库TM锁的相容矩阵(Y=Yes,表示相容的请求; N=No,表示不相

容的请求;-表示没有加锁请求):

T2

T1

S X RS RX SRX -

S Y N Y N N Y

X N N N N N Y

RS Y N Y Y Y Y

RX N N Y Y N Y

SRX N N Y N N Y

- Y Y Y Y Y Y

表一:Oracle 数据库 TM 锁的相容矩阵

一方面,当Oracle 执行SELECT…FOR UPDATE、 INSERT、 UPDATE、 DELETE等 DML

语句时,系统自动在所要操作的表上申请表级RS锁(SELECT…FOR UPDATE)或 RX锁

(INSERT、UPDATE、DELETE),当表级锁获得后,系统再自动申请 TX 锁,并将实际锁

定的数据行的锁标志位置位(指向该TX锁);另一方面,程序或操作人员也可以通过 LOCK

TABLE 语句来指定获得某种类型的TM锁。下表总结了 Oracle中各 SQL语句产生 TM锁的

情况:

SQL语句 表锁模式 允许的锁模式

Select * from table_name…… 无 RS、RX、S、SRX、X

Insert into table_name…… RX RS、RX

Update table_name…… RX RS、RX

Delete from table_name…… RX RS、RX

Select * from table_name for update RS RS、RX、S、SRX

lock table table_name in row share mode RS RS、RX、S、SRX

lock table table_name in row exclusive mode RX RS、RX

lock table table_name in share mode S RS、S

lock table table_name in share row exclusive mode SRX RS

lock table table_name in exclusive mode X 无

表二:Oracle 数据库 TM 锁小结

我们可以看到,通常的 DML 操作(SELECT…FOR UPDATE、INSERT、UPDATE、

DELETE),在表级获得的只是意向锁(RS或 RX),其真正的封锁粒度还是在行级;另外,

Oracle数据库的一个显著特点是,在缺省情况下,单纯地读数据(SELECT)并不加锁, Oracle

通过回滚段(Rollback segment)来保证用户不读“脏”数据。这些都极大地提高了系统的

并发程度。

由于意向锁及数据行上锁标志位的引入,极大地减小了 Oracle 维护行级锁的开销,这

些技术的应用使Oracle 能够高效地处理高度并发的事务请求。 3 Oracle 多粒度封锁机制的监控

3.1 系统视图介绍

为了监控Oracle系统中锁的状况,我们需要对几个系统视图有所了解:

3.1.1 v$lock视图

v$lock视图列出当前系统持有的或正在申请的所有锁的情况,其主要字段说明如下:

字段名称 类型 说明

SID NUMBER 会话(SESSION)标识;

TYPE VARCHAR(2) 区分该锁保护对象的类型;

ID1 NUMBER 锁标识1;

ID2 NUMBER 锁标识2;

LMODE NUMBER 锁模式: 0 (None), 1 (null) ,2 (row share) , 3 (row exclusive) ,4

(share),5(share row exclusive),6(exclusive)

REQUEST NUMBER 申请的锁模式:具体值同上面的LMODE

CTIME NUMBER 已持有或等待锁的时间;

BLOCK NUMBER 是否阻塞其它锁申请;

表三:v$lock 视图主要字段说明

其中在TYPE 字段的取值中,本文只关心 TM、TX两种DML锁类型;

关于ID1、ID2,TYPE取值不同其含义也有所不同:

TYPE ID1 ID2

TM 被修改表的标识(object_id) 0

TX 以十进制数值表示该事务所占用的回滚段号与该事

务在该回滚段的事务表(Transaction table)中所占

用的槽号(slot number,可理解为记录号)。其组成

形式为: 0xRRRRSSSS ( RRRR = RBS number,

SSSS = slot )。

以十进制数值表示环绕

(wrap)次数,即该槽(slot)

被重用的次数;

表四:v$lock 视图中 ID1与 ID2 字段取值说明

3.1.2 v$locked_object 视图

v$locked_object视图列出当前系统中哪些对象正被锁定,其主要字段说明如下:

字段名称 类型 说明

XIDUSN NUMBER 回滚段号;

XIDSLOT NUMBER 槽号;

XIDSQN NUMBER 序列号;

OBJECT_ID NUMBER 被锁对象标识; SESSION_ID NUMBER 持有锁的会话(SESSION)标识;

ORACLE_USERNAME VARCHAR2(30) 持有该锁的用户的Oracle用户名;

OS_USER_NAME VARCHAR2(15) 持有该锁的用户的操作系统用户名;

PROCESS VARCHAR2(9) 操作系统的进程号;

LOCKED_MODE NUMBER 锁模式,取值同表三中的LMODE;

表五:v$locked_object 视图字段说明

3.2 监控脚本

根据上述系统视图,可以编制脚本来监控数据库中锁的状况。

阅读(551) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~