显示在Oracle中锁定的行

Cwo*_*woo 2 oracle locking

使用Oracle,是否可以在执行select语句时指示当前哪些行已锁定(哪些行未锁定)(我不想锁定任何行,仅能显示哪些行已锁定)?

例如,一个伪列将返回对该行的锁定/事务:
SELECT lockname FROM emp;

Mic*_*ton 5

您可以做的一件事是-尽管效率不高,所以我不想将其用于大型数据集。创建一个行级函数来尝试锁定该行。如果失败,则该行已被锁定

    CREATE OR REPLACE FUNCTION is_row_locked (v_rowid ROWID, table_name VARCHAR2)
   RETURN varchar2
IS
   x   NUMBER;
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
   EXECUTE IMMEDIATE    'Begin
                           Select 1 into :x from '
                              || table_name
                              || ' where rowid =:v_rowid for update nowait;
                         Exception
                            When Others Then
                              :x:=null;
                         End;'
   USING OUT x, v_rowid;

   -- now release the lock if we got it. 
   ROLLBACK;

   IF x = 1
   THEN
      RETURN 'N';
   ELSIF x IS NULL
   THEN
      RETURN 'Y';
   END IF;
END;
/
Run Code Online (Sandbox Code Playgroud)

然后你可以

Select field1, field2, is_row_locked(rowid, 'MYTABLE') from mytable;
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是效率不高。

确实,它具有一种完全可赎回的质量-即使您在链接文档中所需的各种v $表上没有选择privs,它也可以工作。但是,如果您拥有privs,则一定要走另一条路。