select for update 是为了在查询时,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性.

举几个例子:
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 查询返回查询结果,但忽略有行锁的记录

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…for update之后,可以使用of子句选择对select的特定数据表进行加锁操作。默认情况下,不使用of子句表示在select所有的数据表中加锁加锁行为子句:

当我们进行for update的操作时,与普通select存在很大不同。一般select是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。在日常中,我们对for update的使用还是比较普遍的,特别是在如pl/sql developer中手工修改数据。此时只是觉得方便,而对for update真正的含义缺乏理解。For update是Oracle提供的手工提高锁级别和范围的特例语句。Oracle的锁机制是目前各类型数据库锁机制中比较优秀的。所以,Oracle认为一般不需要用户和应用直接进行锁的控制和提升。甚至认为死锁这类锁相关问题的出现场景,大都与手工提升锁有关。所以,Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障。

那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案方案问题,需要前期有所准备。

如何解锁:http://www.cnblogs.com/chenwenbiao/archive/2012/06/06/2537496.html

工作中遇到的实际情况:线上锁表,站内信SQL使用了for update

转载于:https://www.cnblogs.com/xiyubaby/p/4623516.html

锁表 for update相关推荐

  1. mysql 事务 for update,mysql事务锁_详解mysql 锁表 for update

    摘要 腾兴网为您分享:详解mysql 锁表 for update,智慧农业,真还赚,悦读小说,学习帮等软件知识,以及电池管家,三国群英传3,userland,运满满货主版,王者荣耀,简单3d动画,嘉丽 ...

  2. oracle锁表导致update,delete,insert出现无反应的问题

    java项目中遇到更新,删除等操作无反应的问题,但后台却不报错,也能正确打印sql语句.最终发现是oracle锁表导致的. 解决方法: 1.查询oracle数据库被锁的表 SELECT T1.ORAC ...

  3. mysql 锁表的情况

    mysql其实在我们使用的时候比较容易造成表被锁的情况,例如以下的几种方式 目前有表 test ,  字段分别有 id,name,age show full PROCESSLIST  查询表的执行情况 ...

  4. 面试官问:select......for update会锁表还是锁行?

    欢迎关注方志朋的博客,回复"666"获面试宝典 select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁 ...

  5. Mysql 事务中Update 会锁表吗?

    Mysql 事务中Update 会锁表吗? 两种情况: 1.带索引 2.不带索引 前提介绍: 方式:采用命令行的方式来模拟 1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开 ...

  6. mysql update join 锁表_Mysql事务中Update是否会锁表?

    两种情况: 1.带索引 2.不带索引 前提介绍: 方式:采用命令行的方式来模拟 1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开启了自动提交事务. 命令:select @@ ...

  7. sql select...for update是锁行还是锁表

    如果查询条件用了索引/主键,那么select - for update就会进行行锁. 如果是普通字段(没有索引/主键),那么select - for update就会进行锁表.

  8. for update造成的Oracle锁表与解锁

    我遇到的情况: 当使用select语句查询表时,后面跟着for update , select * from table for update 当修改表中数据,但是没有commit就关掉PL/SQL, ...

  9. Oracle 共享锁和排它锁、 DML和DDL锁、 for update 锁表的问题

    共享锁和排它锁 oracle有两种模式的锁:排他锁(exclusive lock,即X锁)和共享锁(share lock,即S锁). 共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享 ...

  10. 【转】MySQL中select * for update锁表的问题

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

最新文章

  1. Vista操作系统评估参考资料
  2. 百度html在线编辑器插件,百度编辑器UEditor插件DjangoUeditor v1.8.143
  3. 10048 mysql_MySQL 的 10048问题,如何解决?
  4. windows 2012 如何设置取消禁拼ping
  5. 深度学习基础1(神经网络)
  6. 大数据支撑健康医疗服务落地
  7. MySql计算百分比
  8. 源码实现 -- strdel
  9. 松下plc编程线usb驱动
  10. 「技术」智能温室可升降吊挂式草莓立体无土栽培技术分析
  11. 目标跟踪算法之DSST算法详解
  12. 使用BAT脚本实现一键配置Mysql服务器和开启远程服务
  13. 基金申请-2:期刊如何批量索引SCIE、EI、ISTP (CPCI)?
  14. C语言简单的双人小游戏
  15. 如何申请邮箱号,两步轻松完成
  16. 【iOS】—— FMDB的基础用法
  17. 计算机外围设备的一般功能
  18. GUI设计之马的遍历
  19. 黑群晖docker清理缓存_黑群晖 NAS 瞎折腾 篇一:超简单的docker设置frp内网穿透
  20. 金融工程利率期限结构matlab,2016年武汉大学金融工程实验报告固守内容+利率期限结构及MATLAB应用...

热门文章

  1. Android Studio1.4.x JNI开发基础-基本环境配置
  2. 正文内容 SQL Server 数据库清除日志
  3. -Visual Studio 2010- IntelliTrace(智能跟踪)优化c盘
  4. python_列表——元组——字典——集合
  5. 数据库新手常犯的5个错误
  6. rest规范 ; restful 风格; gradel介绍 ; idea安装 ;
  7. java学习笔记—标准连接池的实现(27)
  8. c#的IList,IEnumerable和IEnumerator
  9. 【c++leetcode】判断一个数是否是2的幂、3的幂、4的幂
  10. MySQL----下载安装