1. oracle for update和for update nowait的区别 http://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html

首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记录的状态。

如果加入了for update, 则Oracle一旦发现(符合查询条件的)这批数据正在被修改,则不会发出该select语句查询,直到数据被修改结束(被commit),马上自动执行这个select语句。 同样,如果该查询语句发出后,有人需要修改这批数据(中的一条或几条),它也必须等到查询结束后(commit)后,才能修改。( 等待别人 + 让别人等待)

for update nowait和 for update 都会对所查询到得结果集进行加锁,所不同的是,如果另外一个线程正在修改结果集中的数据,for update nowait 不会进行资源等待,只要发现结果集中有些数据被加锁,立刻返回 “ORA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源”。

for update 和 for update nowait 加上的是一个行级锁,也就是只有符合where条件的数据被加锁。如果仅仅用update语句来更改数据时,可能会因为加不上锁而没有响应地、莫名其妙地等待,但如果在此之前,for  update NOWAIT语句将要更改的数据试探性地加锁,就可以通过立即返回的错误提示而明白其中的道理,或许这就是For Update和NOWAIT的意义之所在。

经过测试,以for update 或 for update nowait方式进行查询加锁,在select的结果集中,只要有任何一个记录在加锁,则整个结果集都在等待系统资源(如果是nowait,则抛出相应的异常)

如何理解上面的话.
开启一会话 (就是开一个sqlwindow)
select empno,ename from emp where empno='7369' for update nowait ;
得到下面结果集:
empno ename
7369 smith
开启另一会话
select empno,ename from emp where empno='7369' for update nowait ;
返回RA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源
上面会话都提交commit;
~~~~~~~~~~~~~~~~~~~~~
开启一会话,
select empno,ename from emp where empno='7369' for update ;
得到下面结果集:
empno ename
7369 smith
开启另一会话
select empno,ename from emp where empno='7369' for update; 阻塞,不返回错误。
提交第一个会话,第二个回话自动执行
提交第二个会话

  

 for update: 当第一个session最后commit或者rollback之后,第二个session中的检索结果就是自动跳出来,并且也把数据锁定住.
开启一会话:
select empno,ename from emp where empno="7369" for update;
得到下面结果集:
empno ename
7369 smith
开启另一个会话,
update emp set ename='ALLEN' where empno="7396";
阻塞。
提交第一个会话,update 语句执行
再开启一会话
update emp set ename="SMITH" where empno='7396';
同样阻塞,虽然第一个会话因为提交而释放了锁,但是第二个会话中的update 又给这一行加锁了;
for update nowait:当你第一个session放开锁定以后,第二个session才能正常运行。当你第二个session语句运行后,数据又被你第二个session语句锁定住了,这个时候只要你第二个session语句后还没有commit,别的session照样不能对数据进行锁定更新等等。

  

对比区别:
select * from TTable1 for update 锁定表的所有行,只能读不能写
2 select * from TTable1 where pkid = 1 for update 只锁定pkid=1的行
3 select * from Table1 a join Table2 b on a.pkid=b.pkid for update 锁定两个表的所有记录
4 select * from Table1 a join Table2 b on a.pkid=b.pkid where a.pkid = 10 for update 锁定两个表的中满足条件的行
5. select * from Table1 a join Table2 b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid 只锁定Table1中满足条件的行
for update 是把所有的表都锁点 for update of 根据of 后表的条件锁定相对应的表

  

最新文章

  1. 控制 Android 程序使用的内存
  2. 重载与覆盖(java)
  3. PetaPoco4.0的事务为什么不会回滚
  4. cocoapod
  5. IP地址更改小工具(bat命令)
  6. Leetcode 88 Merge Sorted Array STL
  7. js 未结束的字符串常量错误解决方法
  8. 获取不到app.config里面的数据库连接字符串的解决方法
  9. java@ What are C++ features missing in Java
  10. AndroidMainifest标签说明2——<activity>
  11. ACM常用模板
  12. PHP常用的三种设计模式
  13. BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor
  14. python学习05
  15. python json库序列化支持中文
  16. Kinetis Design Studio 下使用J-Link下载程序
  17. Windows平台搭建-----C语言
  18. 【数学建模】day11-典型相关分析
  19. 51nod--1242 斐波那契数列第N项 (矩阵乘法优化)
  20. OpenSource.SerializationLibrary

热门文章

  1. Uva 11694 Gokigen Naname
  2. (step4.2.1) hdu 1372(Knight Moves——BFS)
  3. Surround the Trees(凸包求周长)
  4. C# 调用迅雷 7 迅雷下载开放引擎
  5. vijos 1115 火星人
  6. Oracle执行计划——处理一种并行hint不生效的情况
  7. Maven--构建企业级仓库(二)
  8. 直播时代--IOS直播客户端SDK,美艳直播【开源】
  9. (记录前面算过的后面仍然会用的数减小复杂度)A - AC Me
  10. Python 函数基础、有序集合、文件操作(三)