【问题标题】:Oracle, ROWNUM=1 with FOR UPDATE clause?Oracle,ROWNUM=1 与 FOR UPDATE 子句?
【发布时间】:2017-10-06 19:52:01
【问题描述】:

我的声明:

SELECT ROW_ID DATA_T WHERE CITY_ID=2000 AND IS_FREE=0 AND ROWNUM = 1

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

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

在两个线程调用 SELECT 语句并且显然得到相同的 ROW_ID 之前效果很好......这就是我的问题。

我正在使用 ORACLE DB (12.x)

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

我希望每个“客户”以某种方式获得不同的行或至少锁定其中的一行

【问题讨论】:

  • 此链接可能会有所帮助:stackoverflow.com/questions/7523189/…
  • 为什么不试试这里描述的模式:asktom.oracle.com/pls/apex/…
  • 所以你说要“更新 DATA_T SET IS_FREE=1 where (SELECT ROW_ID DATA_T WHERE CITY_ID=2000 AND IS_FREE=0 AND ROWNUM = 1)
  • 更像UPDATE DATA_T SET IS_FREE=1 WHERE ROWID = (SELECT ROWID FROM DATA_T WHERE CITY_ID=2000 AND IS_FREE = 0 AND ROWNUM = 1) AND IS_FREE = 0 RETURNING ROWID INTO ridRowid_var。祝你好运。

标签: oracle


【解决方案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 之外执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 2018-06-01
    相关资源
    最近更新 更多