FOR UPDATE

严禁在生产库使用 select * from table update 锁表操作

在查询的时候添加for update选项,可以防止查询过程中,数据被修改。
查询行记录都被锁定,只有当前事务提交或回滚才可以将行锁释放。至于悲观锁,顾名思义:锁持续的时间也许会很长,这样会导致并发性比较差。

用了: 
select t.* from 表名  t where 字段=xxx  for update
而不是: 
select t.rowid,t.* from 表名  t where 字段=xxx  for update
进行数据更新操作,就会出现返回错误:这些查询结果不可更新,请包括ROWID或使用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 引发的‘资源忙’异常报告

Oracle不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障。
那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。
场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。
这是解决的方案。

Oracle锁表处理方法:http://www.cnblogs.com/hangwq/p/3527969.html
http://blog.csdn.net/qq_33863843/article/details/61196777

希望对你有帮助,祝你有一个好心情,加油!

若有错误、不全、可优化的点,欢迎纠正与补充!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值