ORACLE FOR UPDATE与FOR UPDATE OF区别(转载)

原文地址:http://blog.sina.com.cn/s/blog_61cd89f60102e7di.html

在生产数据库中,我们为了保证数据读、写的唯一性,经常会碰到下面五种锁语句,区别在那?相信对于新手而言真正搞懂的不多,下面我们用实例说明一下:

    1.FOR UPDATE、

    2.FOR UPDATE OF COLUMN、

    3.FOR UPDATE WAIT 3、

    4.FOR UPDATE NOWAIT、

    5.FOR UPDATE NO WAIT SKIP LOCK

先看几个例子:

  1.select * from Table for update --锁定表的所有行,只能读不能写
  2.select * from Table where pkid = 1 for update --只锁定pkid=1的行
  3.select * from Table a join Table b on a.pkid=b.pkid for update-- 锁定两个表的所有记录
  4.select * from Table a join Table b on a.pkid=b.pkid where a.pkid = 10 for update --锁定两个

      --表的中满足条件的行
  5. select * from Table1 a join Table b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid 只锁定Table1中满足条件的行


  for update 是把所有的表都锁点 for update of 根据of 后表的条件锁定相对应的表

第一点:

    对于单个表读写操作而言,FOR UPDATE与FOR UPDATE OF COLUMN这两语句是一样的,不加条件是全表锁定,加条件是对行级别的锁定,我们举个例子

    SELECT * FROM TABLE FOR UPDATE

    SELECT * FROM TABLE FOR UPDATE OF TABLE_COLUMN

    上面两个没有加WHERE条件,是对全表进行锁定

    SELECT * FROM TABLE WHERE TABLE_COLUMN='条件' FOR UPDATE[FOR UPDATE OF COLUMN]

    此时查询加了查询条件,是对表符合条件记录的一种行级别的锁定

    再次提醒,FOR UPDATE 与FOR UPDATE OF 对于单表操作是一样的

    那么FOR UPDATE OF 与 FOR UPDATE的区别在那呢,在多表进行操作时,FOR UPDATE OF只锁定列所在的表进行锁定,而且是表级别的锁定,FOR UPDATE是对多个表进行锁定,不懂看例子

   1.select * from Table1 a join Table b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid

   2.select * from Table1 a join Table b on a.pkid=b.pkid where a.pkid = 10 for update

   1与2的区别在于,1只锁定表a,而2却要把两个表都要锁定,这才是二者真正的区别所在,即for update 是

   把所有的表都锁点 for update of 根据of 后表的条件锁定相对应的表

第二点:关于NOWAIT(如果一定要用FOR UPDATE,我更建议加上NOWAIT)


    当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待(比如:要查的行已经被其它事务锁了,当前的锁事务与之冲突,加上nowait,当前的事务会结束会提示错误并立即结束 STATEMENT而不再等待).
    WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。
  “使用FOR UPDATE WAIT”子句的优点如下:
  1.防止无限期地等待被锁定的行;
  2.允许应用程序中对锁的等待时间进行更多的控制。
  3.对于交互式应用程序非常有用,因为这些用户不能等待不确定
  4.若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告

猜你喜欢

转载自768992698.iteye.com/blog/2340010