ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle数据库封锁和select...[for update [of tab.col]]的研究

Oracle数据库封锁和select...[for update [of tab.col]]的研究

原创 Linux操作系统 作者:rainlover 时间:2010-10-04 15:33:12 0 删除 编辑

今天早上上班发现有人在CSDN上提出了关于Oracle select...for update of 的问题,页面如下:http://community.csdn.net/Expert/topic/5490/5490597.xml?temp=.9783289

经过研究对比,发现规则,总结如下:

表封锁查询对比 Table For Update For Update of A.Id
A 1.有where条件时,锁定条件中指定的数据行(行级封锁);
2.无where条件是,锁定表A(表级封锁)。
 1.有where条件时,锁定条件中指定的数据行(行级封锁);
2.无where条件是,锁定表A(表级封锁)。
 
A,B 直接封锁A,B表(表级封锁) 1.有where条件时,封锁where条件中满足条件的A表的数据行(行级封锁),B表不锁定;
2.无where条件是,锁定A表(表级锁),B表不锁定。
 

通过对上表的对比,发现对于单表来说For Update和For Update of效果一样,只有在多表查询时产生差异,这个差异在于For Update of使用户能够锁定多表中的指定表或表的数据行。对于在讨论中提到的锁定For Update of A.Id是否指明锁定字段的问题,我觉得不可能,因为Oracle数据库中的锁机制中支持到行级,不可能到字段级。至于为什么要这样表达,估计是将其用于索引的目的,确切目的请高手赐教!

以上功能的相关应用:

现有数据库开发过程中对事务的控制、事务锁、行锁、表锁的发现缺乏必要的方法和手段,通过以下手段可以丰富我们处理开发过程中处理锁问题的方法。
For Update和For Update of使用户能够锁定指定表或表的数据行这个功能在实际应用中具有很重要的意义,特别对于多用户多线程处理中如要先获取数据通过判断在去更新数据(这中间不允许数据发生变化)的时候这个SQL功能是唯一最佳的选择。
此外,为了解决因为For Update而引起的死锁问题,Oracle提供了select...[for update [of tab.col]] [nowait]功能,这个功能使得在执行select...for update前先检查所申请的行、表资源是否可用,如果可用则加写锁,否则直接返回Ora-54错误。这个功能也用很好的应用价值,在多线程中判断资源的可用性方面将发挥作用。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/annicybc/archive/2007/04/30/1592737.aspx

 

(1)、select * from TTable1 for update 锁定表的所有行,只能读不能写

(2)、 select * from TTable1 where pkid = 1 for update 只锁定pkid=1的行

(3)、 select * from Table1 a join Table2 b on a.pkid=b.pkid for update 锁定两个表的所有记录

(4)、 select * from Table1 a join Table2 b on a.pkid=b.pkid where a.pkid = 10 for update 锁定两个表的中满足条件的行

(5)、 select * from Table1 a join Table2 b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid 只锁定Table1中满足条件的行

for update 是把所有的表都锁点

for update of 根据of 后表的条件锁定相对应的表

----------- 关于NOWAIT(如果一定要用FOR UPDATE,我更建议加上NOWAIT) 当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待(比如:要查的行已经被其它事务锁了,当前的锁事务与之冲突,加上nowait,当前的事务会结束会提示错误并立即结束 STATEMENT而不再等待).

如果加了for update后 该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。 因为FOR UPDATE子句获得了锁,所以COMMIT将释放这些锁。当锁释放了,该游标就无效了。

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11320622/viewspace-675432/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Oracle游标大全
请登录后发表评论 登录
全部评论

注册时间:2009-06-08

  • 博文量
    35
  • 访问量
    69718