上层结点加意向锁。申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的
次序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。
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 锁小结