在Oracle 11g中使用ORACLE“ FOR UPDATE SKIP LOCKED”选择非锁定行

时间:2019-06-04 04:59:59

标签: oracle

我必须选择一条未使用FOR UPDATE SKIP LOCKED锁定的记录。

搜索此内容时,我发现12C中有一个称为FETCH的解决方案。但是我正在使用Oracle 11g,我只需要从非锁定记录中获取一条记录即可进行更新。

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

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

谢谢。

2 个答案:

答案 0 :(得分:0)

我认为您可以使用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的需求实施,因此我们通常会在不知不觉中滥用它。

答案 1 :(得分:0)

FOR     cur IN(从mwt_user_wallet中选择rowid,其中wallet_type ='MCA')   环     开始       从MWT_USER_WALLET的id中选择rowid,其中rowid = cur.rowid,以进行nowait更新;     例外       当v_resourcr_busy然后       DBMS_OUTPUT.PUT_LINE('记录已锁定');     结束;   结束循环;

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