現在発生しているトランザクションが獲得しているロックを表示
V$LOCKED_OBJECTを参照する事で現在ロックがされているテーブルを確認できます。ロックしているだけで誰にも迷惑をかけていない(誰も待たせていない)のであれば良いのですが、ロックしている事で誰かを待たせている状況が発生していると問題です。そんな状況はこちらで確認します。
ロックが発生しているテーブルを確認するSQL
以下SQLではRAC環境で利用する事を想定しGV$LOCKED_OBJECTを利用していますが、そのままシングル環境においても利用可能です。
select o.OWNER ,o.OBJECT_NAME ,l.LOCKED_MODE||':'||decode(l.LOCKED_MODE ,0, 'ロック要求中' -- まだ取得できていない ,1, 'NULL' ,2, '行共有(SS)' -- 行共有ロック ,3, '行排他(SX)' -- 行排他表ロック ,4, '共有(S)' -- 共有表ロック ,5, '共有行排他(SRX)' -- 共有行排他表ロック ,6, '排他(X)' -- 排他表ロック ,'???' ) locked_mode_dec ,s.INST_ID ,s.SID ,s.SERIAL# ,s.USERNAME ,s.STATUS ,s.SQL_ID ,s.PROGRAM --,s.SQL_CHILD_NUMBER --,s.PREV_SQL_ID --,s.PREV_CHILD_NUMBER --,s.LOGON_TIME from GV$LOCKED_OBJECT l inner join dba_objects o on l.OBJECT_ID = o.OBJECT_ID inner join GV$SESSION s on l.INST_ID = s.INST_ID and l.SESSION_ID = s.SID order by s.SID ;
出力結果例
OWNER OBJECT_NAME LOCKED_MODE_DE INST_ID SID SERIAL# USERNAME STATUS SQL_ID PROGRAM
------------ ------------ -------------- ------- ------ -------- ---------- ---------- ------------- ------------
SOONI EX01 3:行排他(SX) 1 23 46943 SOONI INACTIVE SQLcl
SOONI TBL26 4:共有(S) 1 25 17258 SOONI INACTIVE osqledit.exe
SOONI TBL26 0:ロック要求中 1 255 5980 DABADA ACTIVE 4hmnb023b3hqk sqlplus.exe
SOONI EX101 3:行排他(SX) 1 256 48387 SOONI INACTIVE osqledit.exe
SQL>
SQL*Plusで利用する際にお使いください
SET LIN 200 COLUMN OWNER FORMAT A12 COLUMN OBJECT_NAME FORMAT A12 COLUMN locked_mode_dec FORMAT A14 COLUMN USERNAME FORMAT A10 COLUMN STATUS FORMAT A10 COLUMN SQL_ID FORMAT A13 COLUMN PROGRAM FORMAT A14 COLUMN PREV_SQL_ID FORMAT A14
誰か待たされている状況が発生していないか確認するSQL
KILLしてしまう事を判断した時は
上記SQLで導出したSIDとSERIAL#を使いKILLする事ができます