`

select for update

 
阅读更多
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  ,则其他线程要更新本记录时,一直等待。
分享到:
评论

相关推荐

    mysql SELECT FOR UPDATE语句使用示例

    本文介绍在mysql中使用mysql SELECT FOR UPDATE 语句时的一些问题与解决办法

    Mysql 数据库死锁过程分析(select for update)

    最近有项目需求,需要保证多台机器不拿到相同的数据,后来发现... for update经常导致数据库死锁问题,下面小编给大家介绍mysql 数据库死锁过程分析(select for update),对mysql数据库死锁问题感兴趣的朋友一起学习吧

    Python Sqlalchemy如何实现select for update

    sqlalchemy 对于行级锁有两种实现方式,with_lockmode(self, mode): 和 with_for_update(self, read=False, nowait=False, of=None),前者在sqlalchemy 0.9.0 被废弃,用后者代替。所以我们使用with_for_update ! 看...

    mysql事务select for update及数据的一致性处理讲解

    MySQL中的事务,默认是自动提交的,即autocommit = 1; 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, ...在SELECT 的读取锁定主要分为两种方式:

    数据库oracle for update of和for update的区别

    数据库oracle锁: for update of和for update的区别,解释得很清楚,有很多详细例子说明。

    GaussDB(WMS)考试题库,HCIP,华为认证题库

    包括300道GaussDB(WMS)考试题库,每道都...B.Select for update命令会获得ROW SHARE类型锁 C.查询命令会在它查询的表上获得ACCESS SHARED类型锁 D.Update/Delete/Insert命令会在目标表上获得ROW SHARE类型的锁 答案:B

    问题共享:修改oracle字符集

    问题共享:修改oracle字符集 修改 oracle 字符集

    MySQL锁类型以及子查询锁表问题、解锁1

    MySQL锁类型以及查询锁表问题、解锁MySQL中select * for update锁表的范围MySQL中select * for update锁表的问题由

    Oracle数据操作和控制语言详解.pdf

    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. 对象权限...

    oracle锁机制探讨

    2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行 Select for update、Lock for update、Lock row share 3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作 Insert、Update、Delete and so on

    oracle执行update语句时卡住问题分析及解决办法

    但是奇怪的是执行其他的select语句却是可以执行的。 原因和解决方法 这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit...

    mysql面试题100题,包含答案和解析.docx

    15、select for update有什么含义,会锁表还是锁行还是其他。 16、MySQL事务得四大特性以及实现原理 17、如果某个表有近千万数据,CRUD比较慢,如何优化。 18、如何写sql能够有效的使用到复合索引。 19、mysql中in ...

    ORACLE锁深入分析

    只能查询这些数据行 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中锁的深入理解

    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子串打开一个光标时,

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    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 段头数据块 ...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part1.rar

    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 段头数据块 ...

    ORA-01480STR 绑定值的结尾 Null字符缺失 的问题原因及解决办法

    本人在工作中,从测试库往正式库中复制记录,用select for update 报错:ORA-01480:STR 绑定值的结尾 Null字符缺失 ,遂上网查找,都说是有非法字符(半个引号) 或者长度超长造成的。根据本人分析,应该不是上述原因...

Global site tag (gtag.js) - Google Analytics