加载中…
个人资料
SniperWD
SniperWD
  • 博客等级:
  • 博客积分:0
  • 博客访问:35,039
  • 关注人气:23
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

Oracle的table lock

(2009-10-09 17:10:00)
标签:

杂谈

分类: SQL & DBMS

先来一段Oracle Concepts里的话:

A table lock can be held in any of several modes: row share (RS), row exclusive (RX), share (S), share row exclusive (SRX), and exclusive (X). The restrictiveness of a table lock's mode determines the modes in which other table locks on the same table can be obtained and held.

                                                                                                                                      Lock Modes Permitted?

SQL Statement Mode of Table Lock

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 table FOR UPDATE OF ...

RS

Y*

Y*

Y*

Y*

N

LOCK TABLE table IN ROW SHARE MODE

RS

Y

Y

Y

Y

N

LOCK TABLE table IN ROW EXCLUSIVE MODE

RX

Y

Y

N

N

N

LOCK TABLE table IN SHARE MODE

S

Y

N

Y

N

N

LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE

SRX

Y

N

N

N

N

LOCK TABLE table IN EXCLUSIVE MODE

X

N

N

N

N

N


RS: row share    RX: row exclusive    S: share    SRX: share row exclusive    X: exclusive

*Yes, if no conflicting row locks are held by another transaction. Otherwise, waits occur.

 

难怪在如下所示的例子中,在一个会话中用select … for update之后,另一个会话中的lock table in share mode语句会被挂起:

scott@ORA10G> select * from test for update;

A
----------
bbb
ccc

scott@ORA10G> lock table test in share mode;

必须commit释放锁之后,第二个会话才能锁定表。因为根据上表的结果,*Yes表示第二个锁需要的资源与第一个锁的资源有冲突,因此需要等待。

scott@ORA10G> commit;

提交完成。

表已锁定。

而下面这种就互不影响锁定了:

scott@ORA10G> select * from test where a='bbb' for update;

A
----------
bbb

scott@ORA10G> select * from test where a='ccc' for update;

A
----------
ccc

或者是这样:

scott@ORA10G> lock table scott.test in share mode;

表已锁定。

scott@ORA10G> lock table scott.test in share mode;

表已锁定。

042里就有一道类似的考题,当时只知道正确答案却不知道为什么,现在终于明白了。。。

ps: Oracle Concepts真的很值得好好读几遍啊

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
前一篇:十一旅游合集
后一篇:ora_rowscn函数
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    < 前一篇十一旅游合集
    后一篇 >ora_rowscn函数
      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有