在刚学oracle时一直不明白for update 的作用,今天考试又遇到郁闷半天,所以加以整理。

一:

1>首先for update是对表的行进行锁定。锁定就好比我们学java Thread那一章时,为某个线程的run()枷锁,当实例化出来多个线程时,它必须一个线程全部执行完后,释放锁其他线程才有机会运行。本文for update功能上一样,就是为一个select语句枷锁,这样在对这个表进行update ,delete时就会处于等待状态,等待selec执行commit或rollback(相当于线程释放锁)后,才可以对表进行更改或删除。

怎样看效果呢?1:首先在“运行”-->cmd-->连接数据库 执行select * from emp for update

2 :然后在打开另一个窗口(就相当于创建了两个用户):“运行”-->cmd-->连接数据库  执行update emp set sal=100;你会发现它不执行了。

2>那马for update与for update of 有神马区别呢?

1.select * from Table1 for update 锁定表的所有行,只能读不能写

  2  select * from Table1 where id = 1 for update 只锁定id=1的行

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

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

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

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

3>关于oracle:select...for update of columns

按照1>步骤执行1:select * from emp for update of sal在另一个窗口中执:2:update emp set job='clerk' where empno=10;按照2>的的思维我们可能认:“1”只锁定了emp表的sal列,其实不然当运行“2”时,我们发现它任然不执行,所以for update of columns 是锁定的与sal相关的行。那么for update 与for update of 有神吗区别呢?区别在于多表连接时;

例如:

按照1>分别执行 select ename,dname from emp,dept where emp.deptno=dept.deptno for update;

另一窗口执行:update dept set dname='haha'where deptno=10;我们发现dept表不能更改

当我们在 select ename,dname from emp,dept where emp.deptno=dept.deptno for update of sal;时

update dept set dname='haha'where deptno=10;可以在执行了。

由此我们可以综结出:for update of columns 用在多表连接锁定时,可以指定要锁定的是哪几张表,而如果表中的列没有在for update of 后面出现的话,就意味着这张表其实并没有被锁定,其他用户是可以对这些表的数据进行update操作的。这种情况经常会出现在用户对带有连接查询的视图进行操作场景下。用户只锁定相关表的数据,其他用户仍然可以对视图中其他原始表的数据来进行操作。

4>关于nowait与wait

SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED]; 
1:其中:

  OF 子句用于指定即将更新的列,即锁定行上的特定列。

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

2:现在执行如下操作:

在plsql develope中打开两个sql窗口, 在1窗口中运行sql 
select * from t where a='1' for update; 
在2窗口中运行sql1 
1. select * from t where a='1'; 这一点问题也没有,因为行级锁不会影响纯粹的select语句 
再运行sql2 
2. select * from t where a='1' for update; 则这一句sql在执行时,永远处于等待状态除非窗口1中sql 被提交或回滚。 
如何才能让sql2不等待或等待指定的时间呢? 我们再运行sql3 
3. select * from t where a='1' for update nowait; 则在执行此sql时,直接报资源忙的异常。 
若执行 select * from t where a='1' for update wait 6; 则在等待6秒后,报 资源忙的异常。 如果我们执行 sql4 
4. select * from t where a='1' for update nowait skip Locked; 则执行sql时,即不等待,也不报资源 忙异常。 
现在我们看看执行如下操作将会发生什么呢? 
在窗口1中执行: 
select * from t where rownum<=3 nowait skip Locked; 
在窗口2中执行: 
select * from t where rownum<=6 nowait skip Locked; 
select for update 也就如此了吧,insert、update、delete操作默认加行级锁,其原理和操作与select for update并无两样。 
select for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的表的行才会被锁定.

二:

1:

如果你想删除或者更新被Select For Update引用的记录,你可以使用Where Current Of语句

  1.  
    DECLARE
  2.  
    CURSOR CUR_NAME IS
  3.  
    SELECT * FROM EMP WHERE deptno=10 FOR UPDATE OF sal;
  4.  
    BEGIN
  5.  
    FOR REC IN CUR_NAME LOOP
  6.  
    UPDATE EMP SET sal =100 ;
  7.  
    END LOOP;
  8.  
    END;

上述pl/sql执行过之后我们发现emp表中所有的sal列数据都被更改,此时我们只想更改跟游标对应的行,所以我们又到where current of执行游标遍历时的当前行就好像for(int i=0;i++;i<10){}where current of与“i”的功能相似。所以当我们想执行游标影响的行时,上我们可以把上面pl/sql快改为:

    1.  
      DECLARE
    2.  
      CURSOR CUR_NAME IS
    3.  
      SELECT JOB FROM EMP WHERE deptno=10 FOR UPDATE OF sal;
    4.  
      BEGIN
    5.  
      FOR REC IN CUR_NAME LOOP
    6.  
      UPDATE EMP SET sal =100 WHERE CURRENT OF CUR_NAME;
    7.  
      END LOOP;
    8.  
      END;

for update 与where current of的问题的更多相关文章

  1. Long Short-Term Memory (LSTM)公式简介

    Long short-term memory: make that short-term memory last for a long time. Paper Reference: A Critica ...

  2. AMD高级应用(翻译)

    Dojo now supports modules written in the Asynchronous Module Definition (AMD) format, which makes co ...

  3. DB2 嵌入式应用中定义游标(开放平台上)

    DECLARE CURSOR statement The DECLARE CURSOR statement defines a cursor. Invocation Although an inter ...

  4. 没有VisualStudio也要HelloWorld

    前言 在博客园看到Artech的通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)这篇文章,于是想跟着教程学习一下.说来惭愧,这篇文章发布于2014年12月,我在2016 ...

  5. Unity协程(Coroutine)原理深入剖析

    Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 其实协程并没有那么复杂,网上很多地方都说是多 ...

  6. Java性能提示(全)

    http://www.onjava.com/pub/a/onjava/2001/05/30/optimization.htmlComparing the performance of LinkedLi ...

  7. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q91-Q93)

    Question 91You have a custom user profile property named MyProperty.You need to create a Web Part th ...

  8. VS2010 单文档+多视图+Outlook风格

    先来个段子 十年生死两茫茫,喜羊羊,灰太狼.舒克贝塔,蓝猫话凄凉.纵使相逢应不识,圣斗士,美猴王.老夫聊发少年狂,治肾亏,不含糖.锦帽貂裘,千骑用康王.为报倾城随太守,三百年,九芝堂.夜来幽梦忽还乡, ...

  9. jquery和css自定义video播放控件

    下面介绍一下通过jquery和css自定义video播放控件. Html5 Video是现在html5最流行的功能之一,得到了大多数最新版本的浏览器支持.包括IE9,也是如此.不同的浏览器提供了不同的 ...

随机推荐

  1. 2018-2019-2 网络对抗技术 20165228 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165228 Exp6 信息搜集与漏洞扫描 回答问题 哪些组织负责DNS,IP的管理. 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务 ...

  2. 关于memset赋值问题

    学习借鉴自:https://blog.csdn.net/yexiaohhjk/article/details/52717934 memset是C语言头文件<string.h>中的一个函数, ...

  3. PyCharm设置仿sublime配色__Py版本2018.3.5

    效果图: 导出settings 模板为: 1.https://files.cnblogs.com/files/xier/PyCharm_settings.zip 2.https://files.cnb ...

  4. vue state

    vuex单一状态树,直接地定位任一特定的状态片段. vuex状态存储响应式,唯一store实例,从store中读取状态: 1.在计算属性中返回某个状态 2.在根实例中注册store选项,该 store ...

  5. 学习笔记DL001:数学符号、深度学习的概念

    数学符号. 数和数组.

  6. vue项目打包后的资源路径问题

    最近做的vue项目,本地测试完成后,build上线,却发现了文件路径问题,提示各种诸如js,css等资源找不到的错: 正确解决方式有两种,一种是绝对路径配置,详细可以网上查,个人推荐第二种相对路径,这 ...

  7. TCP建立与断开连接、socket通讯模板

    在传输层,有一个重点是TCP传输时建立连接的三次"握手"和四次"挥手",因为socket工作于应用层和传输层之间,故而涉及到建立连接和关闭连接的过程,以下笔记可 ...

  8. Luminar 3 for Mac(照片编辑工具)v3.1.0中文特别版

    Luminar for Mac是一款多功能照片编辑软件,使用独特的AI工具加快速度,具备AI Sky Enhancer.Accent AI.太阳光线等创新功能.当然也保留了原有的功能,帮助你轻松的修复 ...

  9. jmeter的简单http接口用法

    1.  jmeter的启动:windows下的环境 进入jmeter的并目录双击启动 Mac电脑 进入bin目录找到jmeter.sh 文件 在终端执行./jmeter.sh 或者./jmeter. ...

  10. Python(三)——文件操作

    在我们用语言的过程中,比如要往文件内进行读写,那么势必要进行文件操作,那么咋操作呢?用眼睛直接看么?今天就定个小目标,把文件读写那些事扯一扯 文件操作 把大象放进冰箱分几步? 第一步:打开冰箱 第二步 ...