oracle

V$LOCKED_OBJECTで現在ロックされているテーブルを確認する

現在発生しているトランザクションが獲得しているロックを表示

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する事ができます

スポンサーリンク