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 |
无 |
字段名称 |
类型 |
说明 |
SID |
NUMBER |
会话(SESSION)标识; |
TYPE |
VARCHAR(2) |
区分该锁保护对象的类型; |
ID1 |
NUMBER |
锁标识1; |
ID2 |
NUMBER |
锁标识2; |
LMODE |
NUMBER |
锁模式:0(None),1(null),2(row share), 3(row ) |