Chinaunix首页 | 论坛 | 博客
  • 博客访问: 79664
  • 博文数量: 65
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-30 11:16
个人简介

cuug

文章分类
文章存档

2014年(65)

我的朋友

分类: Oracle

2014-05-20 11:02:31

下表是在Oracle文档里里面列出的操作会对表加上什么类型的lock,以及该锁和其他类型的操作的兼容性。

Table 13-3 Summary of Table Locks


SQL Statement Mode of Table Lock Lock Modes Permitted?
RS RX S SRX X
SELECT...FROM table...


none


Y


Y


Y


Y


Y


INSERT INTO table...


RX


Y


Y


N


N


N


UPDATE table ...


RX


Y*


Y*


N


N


N


DELETE FROM table...


RX


Y*


Y*


N


N


N


SELECT ... FROM tableFOR UPDATE OF ...


RS(自己测试为RX)


Y*


Y*


Y*


Y*


N


LOCK TABLE tableIN ROW SHARE MODE


RS


Y


Y


Y


Y


N


LOCK TABLE tableIN ROW EXCLUSIVE MODE


RX


Y


Y


N


N


N


LOCK TABLE tableIN SHARE MODE


S


Y


N


Y


N


N


LOCK TABLE tableIN SHARE ROW EXCLUSIVE MODE


SRX


Y


N


N


N


N


LOCK TABLE tableIN EXCLUSIVE MODE


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
阅读(258) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~