Oracle,ROWNUM = 1,FOR UPDATE子句?

时间:2017-10-06 19:52:02

标签: oracle

我的陈述:

<b>, <strong>, <i>, <em>, <br/>, <span>

用于检索具有多个CITY_ID等于2000的条目的db表的第一行。

然后在UPDATE语句中使用返回的ROW_ID,以便使用此行并设置IS_FREE = 1。

这很有效,直到两个线程调用SELECT语句并且显然得到了相同的ROW_ID ......这就是我的问题。

我使用的是ORACLE DB(12.x)

如何解决问题?在这种情况下我可以使用FOR UPDATE吗?

我想要每个&#34;客户&#34;以某种方式得到一个不同的行或至少锁定他们

1 个答案:

答案 0 :(得分:1)

像这样的东西

   function get_row_id return number
   as
      cursor cur_upd is
         SELECT ROW_ID FROM TB WHERE CITY_ID=2000 AND IS_FREE=0 AND ROWNUM = 1
            FOR UPDATE SKIP LOCKED;
   begin
      for get_cur_upd in cur_upd
      loop
          update TB 
             set IS_FREE = 1
           where ROW_ID = get_cur_upd.ROW_ID;
          commit work;
          return get_cur_upd.ROW_ID;
      end loop;
      return null;
  end;
更新后提交或不提交取决于您的逻辑。

此外,您可以在没有更新和提交的情况下返回row_id,稍后在func。

之外执行