讲解有关“SELECT FOR UPDATE“的一些概念

讲解有关“SELECT FOR UPDATE“的一些概念 新客网 XKER.COM 时间:2008-02-02来源:赛迪网 水晶 点击:4351 -

statement: 一个SQL语句。

 

 

session: 一个由ORACLE用户产生的连接,一个用户可以产生多个SESSION ,但相互之间是独立的。

 

transaction:所有的改变都可以划分到transaction里,一个transaction包含一个或多个SQL。当一个SESSION建立的时候就是一个TRANSACTION开始的时刻,此后transaction的开始和结束由DCL控制,也就是每个COMMIT/ROLLBACK都标示着一个transaction的结束。

 

consistency:是对于statement级别而不是transaction级别来说的。sql statement 得到的数据都是以sql statement开始的IMAGE

 

LOCK的基本情况:

 

update, insert ,delete, select ... for updateLOCK相应的ROW

 

只有一个TRANSACTION可以LOCK相应的行,也就是说假如一个ROW已经LOCKED了,那就不能被其他TRANSACTIONLOCK了。

 

LOCKstatement产生但却由TRANSACTION结尾(commitrollback),也就是说一个SQL完成后LOCK还会存在,只有在COMMIT/ROLLBACK后才会RELEASE

 

 

SELECT.... FOR UPDATE [OF cols] [NOWAIT];

OF cols

SELECT cols FROM tables [WHERE...] FOR UPDATE [OF cols] [NOWAIT];

 

前面的FOR UPDATE省略,下面我们来讲一下OF

 

 

transaction A运行

select a.object_name,a.object_id from wwm2 a,wwm3 b

2 where b.status='VALID' and a.object_id=b.object_id

3* for update of a.status

 

transaction B可以对bwwm3的相应行进行DML操作,但不能对awwm2相应行进行DML操作.

 

反一下看看。

 

 

transaction A运行

select a.object_name,a.object_id from wwm2 a,wwm3 b

2 where b.status='VALID' and a.object_id=b.object_id

3* for update of b.status

 

transaction B可以对awwm2的相应行进行DML操作,但不能对bwwm3相应行进行DML操作.

 

也就是说LOCK的还是行,只是假如不加OF的话会对所有涉及的表LOCK,加了OF后只会LOCK OF 字句所在的TABLE.

 

NOWAIT(假如一定要用FOR UPDATE,我更建议加上NOWAIT

 

当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待.返回错误是"ORA-00054: resource busy and acquire with NOWAIT specified"

 

另外如下用法也值得推荐,应该酌情考虑使用。

 

 

FOR UPDATE WAIT 5

 

5秒后会出现提示:

 

 

ORA-30006: resource busy; acquire with WAIT timeout expired

FOR UPDATE NOWAIT SKIP LOCKED;

 

出现提示:

 

 

no rows selected

TABLE LOCKS

LOCK TABLE table(s) IN EXCLUSIVE MODE [NOWAIT];

 

同样也是在transaction结束时才会释放lock

 

DEADLOCK:

 

 

transaction a lock rowA , then transaction b lock rowB

then transaction a tries to lock rowB,

and transaction b tries to lock rowA

 

也就是说两个transaction都相互试图去lock对方已经lockROW,都在等待对方释放自己的lock,这样就使死锁。另外,deadlock也会有600提示。

 

新闻来自: 新客网(www.xker.com) 详文参考:http://www.xker.com/page/e2008/0202/46873.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值