我与更新查询作为开展有关dept表的更新 -获取锁定行的ROWID在Oracle
update dept set dname = initcap(dname) where deptno=20;
正如,我没有犯过,行锁将被放置在该行。我想知道从V$LOCK
锁定的部门表的rowid
。
目前,我无法弄清楚如何得到它。有没有其他方法?
我与更新查询作为开展有关dept表的更新 -获取锁定行的ROWID在Oracle
update dept set dname = initcap(dname) where deptno=20;
正如,我没有犯过,行锁将被放置在该行。我想知道从V$LOCK
锁定的部门表的rowid
。
目前,我无法弄清楚如何得到它。有没有其他方法?
也许你能不能更新之前执行以下语句:
查询V$LOCKED_OBJECT
的
SELECT ROWID AS RID FROM DEPT WHERE DEPTNO = 20 FOR UPDATE;
率先拿到OBJECT_ID。然后查询v$open_cursor
得到SQL_TEXT
,使用这个你可以得到ROWIDs。
SQL> select * from t2 where id=1 for update;
ID KEY VALUE
---------- -------------------- --------------------
1 A101 Athens
运行以下commads为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;
非常感谢Jay ..如果它包含bind(id =:id)值而不是id = 1? –
我模拟了锁。基本上,我想获得rowid,如果锁定是由应用程序(jdbc调用)完成的,并且我不知道rowid。 –
你为什么需要这个? – BobC
获取应用程序锁定的表的行数。 –