我必须选择一条未使用FOR UPDATE SKIP LOCKED锁定的记录。
搜索此内容时,我发现12C中有一个称为FETCH的解决方案。但是我正在使用Oracle 11g,我只需要从非锁定记录中获取一条记录即可进行更新。
select * from t1
where record_status = 'ACTIVE'
FOR UPDATE SKIP LOCKED;
以上查询已锁定所有其他未锁定的记录。请提出一种解决方案,该解决方案只能用于锁定一条记录并在Oracle 11g中获取该记录以进行更新。
谢谢。
答案 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('记录已锁定'); 结束; 结束循环;
我们可以使用它来标识非锁定行吗?