レコードがロックされている場合、どのレコードがロックされているかを知ることができますか?
レコードの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で見つけました
しかし、それは機能していないようです。
セッションによって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によるプロセスの説明 。
次のクエリを実行すると、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;