【问题标题】:SELECT NON LOCKED ROWS with ORACLE "FOR UPDATE SKIP LOCKED" in Oracle 11g在 Oracle 11g 中使用 ORACLE“FOR UPDATE SKIP LOCKED”选择非锁定行
【发布时间】:2019-10-19 14:41:42
【问题描述】:

我必须选择一条没有被 FOR UPDATE SKIP LOCKED 锁定的记录。

当我搜索这个时,我发现 12C 中有一个名为 FETCH 的解决方案。但是我使用的是Oracle 11g,我只需要从非锁定记录中取出一条记录进行更新。

select * from t1 
where record_status = 'ACTIVE' 
FOR UPDATE SKIP LOCKED;

以上查询锁定了所有其他未锁定的记录。请提出一种解决方案,该解决方案可用于仅锁定一条记录并获取该记录以在 oracle 11g 中进行更新。

谢谢。

【问题讨论】:

    标签: oracle


    【解决方案1】:

    我认为您可以使用 rownum 或一些标识符来仅锁定您需要的特定行。

    我们看下面的例子:

    -- session1
    
    SQL> create table t1(id number);
    
    Table created.
    
    SQL> insert into t1 values(1);
    
    1 row created.
    
    SQL> insert into t1 values(2);
    
    1 row created.
    
    SQL> insert into t1 values(3);
    
    1 row created.
    
    SQL> insert into t1 values(4);
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from t1 where id = 2 for update skip locked;
    
            ID
    ----------
             2
    
    
    
    -- Session 2
    
    SQL> select * from t1 where rownum <= 1 for update skip locked;
    
            ID
    ----------
             1
    
    
    
    -- Session 3
    
    SQL> select * from t1 for update skip locked;
    
            ID
    ----------
             3
             4
    

    希望这能解决问题。

    另外,请注意,Oracle 在 AQ 中创建了“跳过锁定”供其内部使用,之后他们将其提供给公众使用。 Oracle 将它用于他们的内部操作,它的工作方式与我们不知道的 Oracle 需求的实现方式完全相同,因此我们通常在不知不觉中滥用它。

    【讨论】:

    • 实际上,我有一个记录池,我需要一次只选择一条记录进行随机更新。因此,我们不能使用您提到的任何特定 ID。有什么方法可以识别 Oracle 中的阻塞行。感谢您的建议。
    • 您可以使用会话 2 查询中提到的 rownum,它只会随机给出一条记录(忘记会话 1 和会话 3 查询。我使用它们是为了更好地理解)。您可以将记录用于会话 2 查询将返回的更新。我认为这将满足您的要求。
    【解决方案2】:

    为 cur IN(从 mwt_user_wallet 中选择 rowid,其中 wallet_type = 'MCA') 环形 开始 从 MWT_USER_WALLET 中选择 rowid 到 id 其中 rowid = cur.rowid 用于更新 nowait; 例外 当 v_resourcr_busy 然后 DBMS_OUTPUT.PUT_LINE('记录锁定'); 结尾; 结束循环;

    我们可以用它来识别非锁定行吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-25
      • 2021-12-05
      • 1970-01-01
      • 2016-08-14
      • 2019-04-16
      • 2018-08-18
      • 1970-01-01
      • 2016-01-29
      相关资源
      最近更新 更多