web-dev-qa-db-ja.com

Oracleでレコードがロックされている場合、どのレコードがロックされているかを知ることができますか?

レコードがロックされている場合、どのレコードがロックされているかを知ることができますか?

レコードのROWIDまたはその他の情報を取得するにはどうすればよいですか?


私はこのSQLでいくつかの情報を得ることができます

_SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW#
   FROM v$locked_object a, dba_objects b, v$session c    
WHERE a.object_id = b.object_id    
    AND a.SESSION_ID = c.sid(+) 
_

関数DBMS_ROWID.ROWID_CREATE()を使用してROWIDを取得するメソッドをWebで見つけました

しかし、それは機能していないようです。

10
iafanda

セッションによってlockedされているすべての行を実際にリストすることはできません。ただし、セッションが別のセッションによってblockedされると、それをブロックしているセッション/行を見つけることができます。

Oracleは、個々の行ロックのリストを維持しません。むしろ、ロックは行自体の中に直接登録されます-追加の列と考えてください。

V$LOCK ビューを使用して、どのセッションがオブジェクトのロックを取得したかを確認できますが、これは行レベルではなく、一般情報のみをリストします。

このビューでは、セッションが別のセッションによってブロックされているかどうかも確認できます。その場合、セッションが別のセッションによってブロックされている場合、行情報はV$SESSION情報に表示されます。

ROWIDを取得できます。2つのセッションを持つ例を作成してみましょう:

SESSION1> create table test as select * from all_objects;

Table created

SESSION1> select rowid from test where object_name = 'TEST' for update;

ROWID
------------------
AAMnFEAAaAAALTDAAz

/* setting identifiers to help with identifying this session later */
SESSION2> exec dbms_application_info.set_client_info('012345');

PL/SQL procedure successfully completed

SESSION2> select 1 from test where object_name = 'TEST' for update;
/*  this will block */

セッション2はセッション1で待機しています。blocking行を次のようにして検出できます。

SESSION1> SELECT o.object_name,
       2         dbms_rowid.ROWID_CREATE (1,
       3                                  s.ROW_WAIT_OBJ#,
       4                                  s.ROW_WAIT_FILE#,
       5                                  s.ROW_WAIT_BLOCK#,
       6                                  s.ROW_WAIT_ROW#) rid
       7     FROM dba_objects o, v$session s
       8    WHERE o.object_id = s.row_wait_obj#
       9      AND s.client_info = '012345';

OBJECT_NAME     RID
--------------- ------------------
TEST            AAMnFEAAaAAALTDAAz

さらに読むために:a Tom Kyteによるプロセスの説明

13
Vincent Malgrat

次のクエリを実行すると、Oracleデータベース内のすべてのテーブルロックを検索できます。

select
   c.owner,
   c.object_name,
   c.object_type,
   b.sid,
   b.serial#,
   b.status,
   b.osuser,
   b.machine
from
   v$locked_object a ,
   v$session b,
   dba_objects c
where
   b.sid = a.session_id
and
   a.object_id = c.object_id;
3
Baji Shaik