- 浏览: 177790 次
- 性别:
- 来自: 上海
文章分类
最新评论
xjr80C7HA3olbVr3y6H3t5--AcosrkB7YVl0ewJ1DtN5R9BE-aI3vCVHHdrfLVR_rshuFGAuxG
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 引发的‘资源忙’异常报告
说明:
select * from t for update 会等待行锁释放之后,返回查询结果。
select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果
select * from t for update wait 5 等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果
select * from t for update skip locked 查询返回查询结果,但忽略有行锁的记录
示例:
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;
结果:
A B
1 1
在2窗口中运行sql1
1. select * from t where a='1';
结果:
A B
1 1
这一点问题也没有,因为行级锁不会影响纯粹的select语句
再运行sql2
2. select * from t where a='1' for update;
结果:
waiting.......
则这一句sql在执行时,永远处于等待状态,除非窗口1中sql被提交或回滚。
如何才能让sql2不等待或等待指定的时间呢? 我们再运行sql3
3.
select * from t where a='1' for update nowait;
结果:
ORA-00054: 资源正忙, 但指定以 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; (此处好像有错误,应该为: select * from t where rownum<=3 for update nowait skip Locked; )
A B
2 2
3 3
在窗口2中执行:
select * from t where rownum<=6 nowait skip Locked;
( 此处好像有错误,应该为:select * from t where rownum<=6 for update nowait skip Locked;可以跳过被窗口1中语句:select * from t where a='1' for update; 锁住的行)
A B
2 2
3 3
4 4
select for update 也就如此了吧,insert、update、delete操作默认加行级锁,其原理和操作与select for update并无两样。
select for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的
表的行才会被锁定。
for update 必须同一个线程 sql提交才能commit成功,其他线程无效。
如果不指定nowait 和wait ,则其他线程要更新本记录时,一直等待。
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 引发的‘资源忙’异常报告
说明:
select * from t for update 会等待行锁释放之后,返回查询结果。
select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果
select * from t for update wait 5 等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果
select * from t for update skip locked 查询返回查询结果,但忽略有行锁的记录
示例:
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;
结果:
A B
1 1
在2窗口中运行sql1
1. select * from t where a='1';
结果:
A B
1 1
这一点问题也没有,因为行级锁不会影响纯粹的select语句
再运行sql2
2. select * from t where a='1' for update;
结果:
waiting.......
则这一句sql在执行时,永远处于等待状态,除非窗口1中sql被提交或回滚。
如何才能让sql2不等待或等待指定的时间呢? 我们再运行sql3
3.
select * from t where a='1' for update nowait;
结果:
ORA-00054: 资源正忙, 但指定以 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; (此处好像有错误,应该为: select * from t where rownum<=3 for update nowait skip Locked; )
A B
2 2
3 3
在窗口2中执行:
select * from t where rownum<=6 nowait skip Locked;
( 此处好像有错误,应该为:select * from t where rownum<=6 for update nowait skip Locked;可以跳过被窗口1中语句:select * from t where a='1' for update; 锁住的行)
A B
2 2
3 3
4 4
select for update 也就如此了吧,insert、update、delete操作默认加行级锁,其原理和操作与select for update并无两样。
select for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的
表的行才会被锁定。
for update 必须同一个线程 sql提交才能commit成功,其他线程无效。
如果不指定nowait 和wait ,则其他线程要更新本记录时,一直等待。
发表评论
-
oracle 查看执行计划的方式
2016-12-20 18:16 348一、通过PL/SQL Dev工具 1、直接File- ... -
pl/sql 乱码解决
2016-08-25 16:25 292select userenv('language') from ... -
使用MySQL Proxy解决MySQL主从同步延迟
2016-08-15 16:26 493使用MySQL Proxy解决MySQL主从同步延迟 ... -
分库分表
2016-07-03 12:30 504第1章 引言 随着互联网 ... -
数据库超时
2016-03-07 10:37 378 -
oracle merge into
2016-03-04 16:16 383/*Merge into 详细介绍 MERGE语句是Oracl ... -
oracle 分区表
2016-03-02 14:59 386(1) 表空间及分区表的 ... -
一些注意的sql写法
2016-01-20 14:07 728Dashboard > 流程空间 > home ... -
oracle 组合索引使用
2016-01-14 20:33 854在Oracle中可以创建组合索引,即同时包含两个或两个以上列的 ... -
oracle 索引
2016-01-14 20:24 611一、 ROWID的概念 存储了row在数据文件中的具体位置: ... -
oracle 查看sql执行计划
2016-01-14 14:06 355如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划 ... -
oracle sql调优 执行计划固化 排序等 SQL Plan Baseline
2015-11-14 16:13 13731.对查询进行优化,应 ... -
oracle 字段类型 收录
2015-11-02 19:52 724字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符 ... -
oracle trunc 函数
2015-08-25 17:57 538Oracle trunc()函数的用法 --Oracle t ... -
oracle 分析函数
2015-08-03 12:49 561oracle分析函数--SQL*PLUS环 ... -
跨数据库事务研究
2015-05-12 11:16 826两种方案: 1、分布式 ... -
Oracle的悲观锁和乐观锁
2015-04-22 13:27 417为了得到最大的性能, ... -
MySQL数据库MyISAM和InnoDB存储引擎的比较
2015-04-21 13:49 451MySQL有多种存储引擎,MyISAM和InnoDB是其中常用 ... -
nosql学习
2015-04-20 09:56 5251、NoSQL数据库概念 NoSQL ... -
sql distinctt group by 分析
2015-04-14 15:28 521在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅 ...
相关推荐
本文介绍在mysql中使用mysql SELECT FOR UPDATE 语句时的一些问题与解决办法
最近有项目需求,需要保证多台机器不拿到相同的数据,后来发现... for update经常导致数据库死锁问题,下面小编给大家介绍mysql 数据库死锁过程分析(select for update),对mysql数据库死锁问题感兴趣的朋友一起学习吧
sqlalchemy 对于行级锁有两种实现方式,with_lockmode(self, mode): 和 with_for_update(self, read=False, nowait=False, of=None),前者在sqlalchemy 0.9.0 被废弃,用后者代替。所以我们使用with_for_update ! 看...
MySQL中的事务,默认是自动提交的,即autocommit = 1; 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, ...在SELECT 的读取锁定主要分为两种方式:
数据库oracle锁: for update of和for update的区别,解释得很清楚,有很多详细例子说明。
包括300道GaussDB(WMS)考试题库,每道都...B.Select for update命令会获得ROW SHARE类型锁 C.查询命令会在它查询的表上获得ACCESS SHARED类型锁 D.Update/Delete/Insert命令会在目标表上获得ROW SHARE类型的锁 答案:B
问题共享:修改oracle字符集 修改 oracle 字符集
MySQL锁类型以及查询锁表问题、解锁MySQL中select * for update锁表的范围MySQL中select * for update锁表的问题由
6. SELECT FOR UPDATE 3 7. 锁定表 3 8. 死锁 4 9. 事务控制 4 10. Savepoint 和 部分回滚(Partial Rollback) 5 11. 一致性和事务 6 12. 建立和修改用户 8 13. 创建和更改用户账号 9 14. 权限和角色 10 15. 对象权限...
2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行 Select for update、Lock for update、Lock row share 3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作 Insert、Update、Delete and so on
但是奇怪的是执行其他的select语句却是可以执行的。 原因和解决方法 这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit...
15、select for update有什么含义,会锁表还是锁行还是其他。 16、MySQL事务得四大特性以及实现原理 17、如果某个表有近千万数据,CRUD比较慢,如何优化。 18、如何写sql能够有效的使用到复合索引。 19、mysql中in ...
只能查询这些数据行 Select for update、Lock for?update、 Lock row share? 3 SX(Row-X) 行级排它锁,? 在提交前不允许做DML操作 Insert、Update、? Delete、Lock row share? 4 S(Share) 共享锁 Create index、...
ORACLE里锁有以下几种模式:0:none1:null 空2:Row-S 行共享(RS):共享表锁3:Row-X 行...2级锁有:Select for update,Lock For Update,Lock Row Share select for update当对话使用for update子串打开一个光标时,
2.3.1 select for update 30 2.3.2 外键和索引 36 第3章 latch和等待 44 3.1 共享池中的latch争用 45 .3.2 数据缓冲池latch争用 54 3.2.1 表数据块 54 3.2.2 索引数据块 59 3.2.3 索引根数据块 62 3.2.4 段头数据块 ...
2.3.1 select for update 30 2.3.2 外键和索引 36 第3章 latch和等待 44 3.1 共享池中的latch争用 45 .3.2 数据缓冲池latch争用 54 3.2.1 表数据块 54 3.2.2 索引数据块 59 3.2.3 索引根数据块 62 3.2.4 段头数据块 ...
本人在工作中,从测试库往正式库中复制记录,用select for update 报错:ORA-01480:STR 绑定值的结尾 Null字符缺失 ,遂上网查找,都说是有非法字符(半个引号) 或者长度超长造成的。根据本人分析,应该不是上述原因...