DBMS_ROWID.ROWID_CREATE()でROWIDを作成する
V$SESSIONのBLOCKING_SESSION_STATUSを見れば行ロックが原因で待たされているSQLと対象レコードの特定ができます。レコードの特定はDBMS_ROWID.ROWID_CREATE()ファンクションを使うとrowidを求める事ができるのでこちらを使います。
ロックで待たされているセッションのSQLとその対象行を特定するSQL
select s.INST_ID ,s.SID ,s.SERIAL# -- ,s.USERNAME -- ,s.STATUS ,s.SQL_ID ,o.OWNER ,o.OBJECT_NAME ,DBMS_ROWID.ROWID_CREATE ( rowid_type => 1 ,object_number => s.ROW_WAIT_OBJ# ,relative_fno => s.ROW_WAIT_FILE# ,block_number => s.ROW_WAIT_BLOCK# ,row_number => s.ROW_WAIT_ROW# ) as M_ROWID -- rowidを導出 ,decode(l.LOCKED_MODE ,0, 'ロック要求中' -- まだ取得できていない ,1, 'NULL' ,2, '行共有(SS)' -- 行共有ロック ,3, '行排他(SX)' -- 行排他表ロック ,4, '共有(S)' -- 共有表ロック ,5, '共有行排他(SRX)' -- 共有行排他表ロック ,6, '排他(X)' -- 排他表ロック ,'???' ) locked_mode_dec from GV$SESSION s inner join GV$LOCKED_OBJECT l on s.INST_ID = l.INST_ID and s.sid = l.session_id inner join DBA_OBJECTS o on l.object_id = o.object_id where s.blocking_session_status ='VALID' order by s.SID ;
出力結果例
INST_ID SID SERIAL# SQL_ID OWNER OBJECT_NAM M_ROWID LOCKED_MOD
------- ------ ---------- ------------- ---------- ---------- -------------------- ----------
1 261 45418 116009648rnhr SOONI EX01 AAAYbdAAFAAAADVAAF 行排他(SX)
SQL>
--
-- DBMS_ROWID.ROWID_CREATE()で求めたROWIDで対象行を特定する
--
SQL> select * from sooni.ex01 where rowid='AAAYbdAAFAAAADVAAF'
2 ;
SID SNAME BIRTHDAY NOTE KANA ROMA
______ ________ ___________ __________ _______ _______
7 喜多川 00-12-13 納豆は嫌いです
SQL>
--
-- SQL_IDをキーにV$SQLから対象(待たされている)SQLを確認する
--
SQL> select s.SQL_TEXT from v$sql s where s.SQL_ID='116009648rnhr'
2 ;
SQL_TEXT
----------------------------------------------------------------------------------
update ex01 t set t.SNAME='木田川' where t.SID=7
SQL>
SQL*Plus用
set lin 100 COLUMN INST_ID FORMAT 99 COLUMN SID FORMAT 99999 COLUMN SQL_ID FORMAT A13 COLUMN OWNER FORMAT A10 COLUMN OBJECT_NAME FORMAT A10 COLUMN M_ROWID FORMAT A20 COLUMN locked_mode_dec FORMAT A10