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

导读:

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

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

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  


















表封锁查询对比
TableFor UpdateFor 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错误。这个功能也用很好的应用价值,在多线程中判断资源的可用性方面将发挥作用。



本文转自

http://blog.csdn.net/annicybc/archive/2007/04/30/1592737.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值