对比区别:
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中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。
分享到:
相关推荐
### 数据库Oracle锁:FOR UPDATE OF与FOR UPDATE的区别 在Oracle数据库中,为了确保数据的一致性和准确性,尤其是在多用户环境中进行并发操作时,锁机制是必不可少的一部分。本文将详细介绍`FOR UPDATE`与`FOR ...
标题和描述均聚焦于Oracle数据库中`FOR UPDATE`与`FOR UPDATE NOWAIT`两种锁定机制的区别,这在并发控制和事务处理中具有重要的意义。在深入解析这两种指令之前,我们先来简要回顾一下锁定机制的基本概念。 在...
这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。由于我的java程序...
例如:`BEGIN FOR cr IN (SELECT * FROM t_join_situation WHERE year='2011') LOOP UPDATE t_join_situation SET join_state='1' WHERE current of cr; END LOOP`。这种方式适用于大批量数据的更新,但需要注意游标...
Oracle 11g基于SQL,所以学习标准SQL语法是必要的,如SELECT用于查询数据,INSERT用于插入数据,UPDATE用于修改数据,DELETE用于删除数据,以及DDL(Data Definition Language)用于创建和管理数据库对象,如表、...
shell连接oracle数据库工具脚本:支持select/insert/update/delete 部署位置:/root/sysmonitor db:数据库文件夹 dbconfig.properties:数据库配置文件, dbConnectTest.sh:连接测试文件 dbExecurteSQL.sh:...
本“数据库Oracle自学通”文档旨在帮助初学者快速掌握Oracle的基础功能和SQL语法。 一、Oracle数据库基础 Oracle数据库由一系列数据文件组成,这些文件存储在磁盘上,通过内存结构进行管理。Oracle使用实例来处理...
总结来说,针对Oracle数据库的update语句的优化,主要可以从简化SQL语句结构、合理使用子查询和join操作、采用merge语句以及编写PL/SQL游标处理等多方面入手。在实际应用中,根据具体情况选择合适的优化方案,能够...
本文档详细介绍了如何使用 Veeam 备份恢复 Oracle 数据库的配置过程,从环境准备到推送 Oracle RMAN Plugin,再到创建备份作业和运行备份作业,最后实现 Oracle 数据库的异机恢复。本文档旨在帮助读者快速掌握 Veeam...
以下是对"Oracle数据库经典教程"的部分内容的详细说明: **走进Oracle** Oracle数据库系统由Oracle公司开发,提供了数据存储、管理、备份和恢复等一系列功能。它的强大性能、高度可扩展性和安全性使得它成为许多...
Oracle数据库中的多表关联UPDATE语句是用于在一个表中更新数据时,依据另一个表的条件进行操作的关键技术。这在处理复杂的数据同步或修正场景时非常有用。在本例中,我们将探讨如何利用多表关联来更新数据,并通过...
《JSP+Oracle数据库组建动态网站经典实例》是一份针对Web开发者的宝贵资源,它深入浅出地展示了如何使用Java Server Pages(JSP)技术与Oracle数据库相结合,构建功能丰富的动态网站。这份实例集合涵盖了多个实际...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,它在企业级数据存储、管理和处理方面具有卓越性能。"Oracle数据库资料"这个压缩包很可能是为学习和掌握Oracle数据库提供的一系列教程和参考文档。下面,我们...
Oracle的DML操作包括插入(INSERT)、更新(UPDATE)和删除(DELETE)数据,这是数据库日常管理的基本技能。同时,事务管理(Transaction Management)和回滚(ROLLBACK)也是确保数据完整性和一致性的关键部分。 ...
Oracle数据库是一种广泛应用于企业和组织的大型关系型数据库管理系统,它提供了高效的数据存储、管理和查询功能。在Oracle数据库课程中,学生们通常会被要求掌握一系列基础知识,包括数据库的逻辑存储结构、服务端口...
在Oracle数据库中,UPDATE语句是用于修改已存在数据的基本操作之一。在上述示例中,我们看到三种不同的UPDATE语句形式,它们各自处理特定的情况并具有不同的性能特点。 1) **最简单的形式**: 这种情况下,我们更新...
总的来说,这个Oracle数据库编程教案全面覆盖了数据库的使用、编程和管理,无论你是初学者还是有经验的开发者,都能从中受益。通过这五天的学习,你可以系统地提升在Oracle数据库方面的技能,为实际工作中的数据库...
Oracle 数据库语法是数据库管理系统中最重要的一部分,它提供了对数据库进行操作和管理的各种方法和手段。 Oracle 数据库语法包括了查询语法、函数、视图、存储过程、触发器等多种元素,以下是 Oracle 数据库语法的...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,用于存储、管理和检索复杂的数据。为了与Oracle数据库进行交互,我们需要可靠的连接工具。"Oracle数据库连接工具"指的是可以方便地连接到Oracle数据库并执行...