当前位置:  数据库>oracle

Oracle for update of 和 for update区别

    来源: 互联网  发布时间:2017-04-20

    本文导语: 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...

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 后表的条件锁定相对应的表

  -----------

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

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

  如果加了for update后 该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。

  因为FOR   UPDATE子句获得了锁,所以COMMIT将释放这些锁。当锁释放了,该游标就无效了。

  就是这些区别

 

关于Oracle中的select...for update of columns

问题,如下:select * from emp where empno = 7369 for update; 会对表中员工编号为7369的记录进行上锁。其他用户无法对该记录进行操作,只能查询。select * from emp where empno = 7369 for update of sal; 这条语句是不是意味着只对表中的7369 这一行的sal字段的数据进行了上锁,其他数据则可以被其他用户做更新操作呢。学员测试结果为二条语句的效果是一样的。其他用户对整行都无法更新,那么是不是意味着 for update of columns这句没有什么意义呢?

  这个问题估计很多玩ORACLE的同学们都没有去思考过【网上相关的帖子不多】。现在将其功能讲解一下。

  从单独一张表的操作来看,上面二条语句的效果确实是相同的。但是如果涉及到多表操作的时候 for update of columns就起到了非常大的作用了。现假定有二个用户,scott和mm。


scott执行语句:select * from emp e,dept d where e.deptno = d.deptno for update; --对二张表都进行了整表锁定
mm执行语句:select * from scott.dept for update wait 3; --试图锁定scott用户的dept表

结果是:
ERROR 位于第 1 行:
ORA-30006: 资源已被占用; 执行操作时出现 WAIT 超时

现在,scott用户先进行解锁rollback,再在for update语句后面加上of columns,进行测试

scott执行语句:select * from emp e,dept d where e.deptno = d.deptno for update of sal ;
mm执行语句:select * from scott.dept for update wait 3;

结果是:

成功锁定了dept表的数据.

mm再次执行语句:select * from scott.emp for update wait 3;

结果是:
ERROR 位于第 1 行:
ORA-30006: 资源已被占用; 执行操作时出现 WAIT 超时

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

 

Oracle 的for update行锁
 SELECT...FOR UPDATE 语句的语法如下:
  SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
其中:
  OF 子句用于指定即将更新的列,即锁定行上的特定列。
  WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待
  “使用FOR UPDATE WAIT”子句的优点如下:
  1防止无限期地等待被锁定的行;
  2允许应用程序中对锁的等待时间进行更多的控制。
  3对于交互式应用程序非常有用,因为这些用户不能等待不确定
  4 若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告









示例:
create table t(a varchar2(20),b varchar2(20));
insert into t values('1','1');
insert into t values('2','2');
insert into t values('3','3');
insert into t values('4','4');
现在执行如下操作:
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中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。

























    
 
 

您可能感兴趣的文章:

  • 解析mysql与Oracle update的区别
  • oracle中UPDATE nowait 的使用方法介绍
  • 发行版Oracle Enterprise Linux 5 Update 4
  • 一个关于JAVA操作oracle数据库时UPDATE权限的问题
  • Oracle批量update和delete
  • sqlserver中delete、update中使用表别名和oracle的区别
  • ORACLE SQL-UPDATE、DELETE、INSERT优化和使用技巧分享
  • Oracle 的for update行锁语法
  • 那里有免费的oracle odbc driver for linux?或怎么破解easysoft oracle odbc driver安装包?急
  • ORACLE JDBC FOR ORACLE7.3.4?
  • 问一个简单的问题,我装了oracle 8.05,我并没有发有发现JDBC这个目录,是不是我要下载jdbc for oracle。
  • sql iis7站长之家
  • 最常见的问题:哪里有Oracle7.3 for sco5.0.5的下载?
  • 请问在哪可以下载Oracle FOR solaris /x86
  • 请问那里可以下载oracle 9i for linux 64位的安装程序 小弟只有10分了帮帮忙拉!!
  • 那里有下载ORACLE8.1.7 FOR LINUX?
  • 关于JDBC for Oracle驱动的问题?紧急求助?
  • oracle for linux 是否免费?
  • 那里有免费的oracle odbc driver for linux?
  • Oracle 10g client for Solaris
  • 哪有Oracle8i(for win2000)版下?
  • Oracle 10G for Linux常用命令
  • Oracle 10g for solaris,在哪能下到?
  • 初学者请教,SCO UNIX 安装oracle9i 是用for哪个的版本?
  • Oracle 11 Client FOR Linux的安装
  • Oracle 11gR1 for Linux现在已经开始提供下载
  • Oracle 8.1.5 For Linux安装漏洞
  • oracle for linux 下面的sqlca.sqlcode是一个什么命令去查?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • oracle817在redhat7.3上安装出现:Error in invoking target relink of makeifle
  • Redhat AS4 安装 oracle10g出现 Error in invoking target 'client_sharedlib' of makefile '.../network/lib/'ins_net_client.mk' 错误
  • error in invoking target 'client_sharedlib' of makefile 'opt/app/oracle/product/10.2.0/db_1/network/lib/ins_net_client.mk'
  • FC6上安装oracle 10g时报错 "Thrown when the IP address of a host cannot be determined"
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,