获取oracle中锁定行的rowid

时间:2017-03-02 05:23:12

标签: oracle

我正在使用更新查询执行dept表更新为 -

update dept set dname = initcap(dname) where deptno=20;

因为,我还没有提交,行锁会放在行上。我想找出rowid锁定的部门表V$LOCK

目前,我无法弄清楚如何获得它。还有其他办法吗?

2 个答案:

答案 0 :(得分:0)

也许您可以在更新之前执行以下语句:

SELECT ROWID AS RID FROM DEPT WHERE DEPTNO = 20 FOR UPDATE;

答案 1 :(得分:0)

首先查询V$LOCKED_OBJECT以获取object_id。然后查询v$open_cursor以获取SQL_TEXT,使用此功能可以获得ROWID。

SQL> select * from t2 where id=1 for update;

        ID KEY                  VALUE
---------- -------------------- --------------------
         1 A101                 Athens

将以下逗号作为SYSDBA

运行
SQL> select session_id, object_id from v$locked_object;

SESSION_ID  OBJECT_ID
---------- ----------
      1724     213690

SQL> select user_name, sql_text from v$open_cursor where sid=1724;

USER_NAME    SQL_TEXT
---------    ------------------------------------------------------------
JAY          insert into sys.aud$( sessionid,entryid,statement,ntimestamp
JAY          select * from t2 where id=1 for update


SQL> select rowid from jay.t2 where id=1;

ROWID
------------------
AAA0K6AAEAAAACsAAA

Oracle不会跟踪锁定的行。如果有阻塞的行,那么您可以获得如下所示的rowid。

SQL> select dbms_rowid.ROWID_CREATE(1,s.ROW_WAIT_OBJ#,s.ROW_WAIT_FILE#,s.ROW_WAIT_BLOCK#,s.ROW_WAIT_ROW#) rid from v$session s join v$locked_object lo on s.ROW_WAIT_OBJ#=lo.object_id;