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

来源:互联网 发布:免费的vpn软件 编辑:程序博客网 时间:2024/06/04 17:44

表封锁查询对比 表封锁查询对比 Table A For Update 1.有where条件时,锁定条件中指定的数据行(行级封锁);2.无where条件是,锁定表A(表级封锁)。For Update of A.Id1.有where条件时,锁定条件中指定的数据行(行级封锁);2.无where条件是,锁定表A(表级封锁)。A,B For Update 直接封锁A,B表(表级封锁) For Update of A.Id1.有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错误。这个功能也用很好的应用价值,在多线程中判断资源的可用性方面将发挥作用。