Oracle 加在表上的锁类型
Oracle 加在表上的锁类型
下表是在Oracle文档里里面列出的操作会对表加上什么类型的lock,以及该锁和其他类型的操作的兼容性。
Table 13-3 Summary of Table Locks
SQL Statement | Mode of Table Lock | Lock Modes Permitted? | ||||
---|---|---|---|---|---|---|
RS | RX | S | SRX | X | ||
|
none |
Y |
Y |
Y |
Y |
Y |
|
RX |
Y |
Y |
N |
N |
N |
|
RX |
Y* |
Y* |
N |
N |
N |
|
RX |
Y* |
Y* |
N |
N |
N |
|
RS(自己测试为RX) |
Y* |
Y* |
Y* |
Y* |
N |
|
RS |
Y |
Y |
Y |
Y |
N |
|
RX |
Y |
Y |
N |
N |
N |
|
S |
Y |
N |
Y |
N |
N |
|
SRX |
Y |
N |
N |
N |
N |
|
X |
N |
N |
N |
N |
N |
与v$lock里面LMODE字段对应关系为:
none:0
RS: row share :2
RX: row exclusive:3
S: share:4
SRX: share row exclusive:5
X: exclusive:6
1,select 操作不会加任何锁。
select * from v$lock where sid=‘当前session的id’ 不会查询到结果。
2,insert into test values(3,'C');在表示加上RX锁。查看v$lock,select * from v$lock where sid=144看到
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
32E29C04 32E29D20 144 TX 458760 685 6 0 36 0
32DC4224 32DC423C 144 TM 54148 0 3 0 36 0
type为TM的为在表上加的锁,这里LMODE为3,对应RX,block为0表示没有阻塞别的session。
typeweiTX的表示在行上加的锁,这里LMODE为6,对应X,block为0表示没有阻塞别的session。
如果在两session中同时对同一条记录update,会得到下面的结果:
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
32DC4224 32DC423C 144 TM 54148 0 3 0 132 0
32E29C04 32E29D20 144 TX 458760 685 6 0 132 1
32DC42E8 32DC4300 159 TM 54148 0 3 0 6 0
33834450 33834464 159 TX 458760 685 0 6 6 0
SID 144先做,block为1表示阻塞了别的session。SID 159 TX类型的锁LMODE为0,而request为6表示申请X锁,但是没有获得,意味着被阻塞了。
3,lock table test in ROW SHARE MODE;加的是RS锁。
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
32DC4224 32DC423C 159 TM 54148 0 2 0 6 0
执行select name from test where id=3 for update of name;发现和文档说的不一样,看到别人也遇到同样迷惑:
http://www.itpub.net/thread-1145275-1-1.html : 经过测试和查询发现,实际上在oracle 8i和9i(早版本)中,select .... for update产生的确实是RS锁。
但是在后来的版本中产生的是RX锁。不过oracle的文档一直到10g都没有更新这一变化。这一点非常坑爹。
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
32E29C04 32E29D20 144 TX 589869 828 6 0 6 0
32DC4224 32DC423C 144 TM 54148 0 3 0 6 0
|
评论暂时关闭