分类: 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 监控脚本
根据上述系统视图,可以编制脚本来监控数据库中锁的状况。 |