Welcome 微信登录

首页 / 数据库 / MySQL / Oracle 加在表上的锁类型

下表是在Oracle文档里里面列出的操作会对表加上什么类型的lock,以及该锁和其他类型的操作的兼容性。
Table 13-3 Summary of Table Locks
SQL StatementMode of Table LockLock Modes Permitted?
RSRXSSRXX
SELECT...FROM table...noneYYYYY
INSERT INTO table...RXYYNNN
UPDATE table ...RXY*Y*NNN
DELETE FROM table...RXY*Y*NNN
SELECT ... FROM tableFOR UPDATE OF ...RS(自己测试为RX)Y*Y*Y*Y*N
LOCK TABLE tableIN ROW SHARE MODERSYYYYN
LOCK TABLE tableIN ROW EXCLUSIVE MODERXYYNNN
LOCK TABLE tableIN SHARE MODESYNYNN
LOCK TABLE tableIN SHARE ROW EXCLUSIVE MODESRXYNNNN
LOCK TABLE tableIN EXCLUSIVE MODEXNNNNN
与v$lock里面LMODE字段对应关系为:none:0RS: row share :2
RX: row exclusive:3S: share:4SRX: share row exclusive:5X: 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
  • 1
  • 2
  • 下一页
Oracle 连接出错最常见的原因Oracle数据库通过undo保证一致性读和不发生脏读相关资讯      Oracle教程 
  • Oracle中纯数字的varchar2类型和  (07/29/2015 07:20:43)
  • Oracle教程:Oracle中查看DBLink密  (07/29/2015 07:16:55)
  • [Oracle] SQL*Loader 详细使用教程  (08/11/2013 21:30:36)
  • Oracle教程:Oracle中kill死锁进程  (07/29/2015 07:18:28)
  • Oracle教程:ORA-25153 临时表空间  (07/29/2015 07:13:37)
  • Oracle教程之管理安全和资源  (04/08/2013 11:39:32)
本文评论 查看全部评论 (0)
表情: 姓名: 字数