select……for update

what:

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

 

  SELECT…FOR UPDATE 语句的语法如下:
    SELECT … FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
  其中:
    OF 子句用于指定即将更新的列,即锁定行上的特定列。
    WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。

 

  demo:

    a、select * from t for update 会等待行锁释放之后,返回查询结果。
    b、select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果
    c、select * from t for update wait 5 等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果
    d、select * from t for update skip locked 查询返回查询结果,但忽略有行锁的记录

 

how:

  加锁范围子句:在select…for update之后,可以使用of子句选择对select的特定数据进行加锁操作。默认情况下,不使用of子句表示在select所有的数据中加锁;

 

  加锁行为子句:当我们进行for update的操作时,与普通select存在很大不同。一般select是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。

 

where:

  Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障

 

  那些需要业务层面数据独占时,可以考虑使用for update。
    场景上,比如火车票订票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。

  

 

posted @ 2022-07-23 16:13  修心而结网  阅读(422)  评论(0编辑  收藏  举报