zoukankan      html  css  js  c++  java
  • 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

    4、FOR UPDATE NOTWAIT

    5、FOR UPDATE NO WAIT SKIP LOCK

    下面先来看看几个例子:

    1、SELECT * FROM EMP FOR UPDATE ;  --锁定表的所有行,只能读不能写

    1 declare
    2     cursor emp_cur 
    3     is
    4     select * from emp for update ; --锁定所有的行,只能读不能写
    5 begin
    6     for x in emp_cur loop 
    7         update emp set sal = 9999 where current of emp_cur ;
    8     end loop ;
    9 end ;

    2、SELECT * FROM EMP WHERE DEPTNO = 10 FOR UPDATE ;    --只锁定DEPTNO = 10 的行 

    1 declare
    2     cursor emp_cur 
    3     is
    4     SELECT * FROM EMP WHERE DEPTNO = 10 FOR UPDATE ;    --只锁定DEPTNO = 10 的行 
    5 begin
    6     for x in emp_cur loop 
    7         update emp set sal = 9999 where current of emp_cur ;
    8     end loop ;
    9 end ;

    3、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO FOR UPDATE     --锁定两个表的所有记录

    4、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE  ;   -- 锁定两个表中满足条件的行

    5、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE OF E.DEPTNO ;   --只会锁定EMP表中满足条件的行

    可以看出来FOR UPDATE是把所有的表都锁定,而FOR UPDATE OF 是根据OF后面的条件锁定相应的表

    第一点:

    对于单表操作而言,FOR UPDATE 和 FOR UPDATE OF 是一样的不加条件是对全表的锁定,加了条件是对行级别的锁定。举个栗子:

    1、不加WHERE条件是对全表进行锁定

    SELECT * FROM EMP FOR UPDATE ;   --对全表进行锁定

    2、加上WHERE条件是对行级别的锁定

    SELECT * FROM EMP WHERE DEPTNO = 10 FOR UPDATE ;  --只对满足条件的10部门进行锁定

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

    那么FOR UPDATE 和 FOR UPDATE OF 的区别到底在哪呢?在进行多表查询时FOR UPDATE OF只锁定列所在的表进行锁定,而且是表级别的锁定,FOR UPDATE是对多个表进行锁定,不懂看例子:

    1、SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE OF E.DEPTNO ;

    --只锁定E.DEPTNO所在的表并且只锁定DEPTNO = 10 的行

    2、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE ;  

    -- 锁定多个表

    1 和 2 的区别在于 , 1只锁定表EMP 而 2 要锁定EMP表和DEPT表 ,这才是二者真正的区别。 即 FOR UPDATE 是把所有的表都锁上,而FOR UPDATE OF是根据相应的条件锁定相应的表 

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

    1、当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待(比如:要查的行已经被其它事务锁了,当前的锁事务与之冲突,加上nowait,当前的事务会结束会提示错误并立即结束 STATEMENT而不再等待).

    2、WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。

    “使用FOR UPDATE WAIT”子句的优点如下:
      1.防止无限期地等待被锁定的行;
      2.允许应用程序中对锁的等待时间进行更多的控制。
      3.对于交互式应用程序非常有用,因为这些用户不能等待不确定
      4.若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告

  • 相关阅读:
    通过internet网络唤醒主机的方法
    信用风险计量模型
    Vintage、滚动率、迁移率的应用
    (信贷风控十五)评分卡分数切分、授信额度与利率定价
    (信贷风控十)催收评分卡的介绍
    (信贷风控十六)组合评分卡模型
    (信贷风控十四)深度神经网络模型用于评分卡模型(理论)
    (十三)GBDT模型用于评分卡模型python实现
    (信贷风控九)行为评分卡模型python实现
    改变jupyter notebook的主题背景
  • 原文地址:https://www.cnblogs.com/zbj815/p/6844434.html
Copyright © 2011-2022 走看看