HOME >> Tips >> Oracle

FOR UPDATE の排他ロックを解除できなくなった場合の対処法

2016/11/4
文書番号:20598



Oracle で排他ロックをかける場合には「FOR UPDATE」を使用します。

通常は「COMMIT」もしくは「ROLLBACK」にてそのロックは解除されますが、 何らかの問題があって解除されなかった場合には当該セッションを削除することでロックを解除することができます。

【操作手順】

  1. まずはロックをしているセッションを突き止めます。
    以下のSQLを実行し、該当のセッションの「SID」と「SERIAL#」を確認します。

    
    SELECT SID
          ,SERIAL#
          ,SADDR
          ,MACHINE
          ,USERNAME
          ,PROGRAM 
    FROM   V$SESSION 
    WHERE  SID = ANY(SELECT SID 
                     FROM V$LOCK 
                     WHERE TYPE IN ('TX','TM')
                     ); 
    

    クリックで拡大
  2. 上記で取得した「SID」と「SERIAL#」を指定して「KILL SESSION」を実行してセッションを削除します。
    
    ALTER SYSTEM KILL SESSION 'SID, SERIAL#'; 
    

    クリックで拡大
  3. 再度 手順1のSQLを実行し、該当のセッションがなくなっていることを確認します。
    セッション削除されていれば、該当のテーブルへアクセスし、ロックが解除されていることを確認します。

【参考情報】

OracleR Databaseリファレンス V$SESSION
https://docs.oracle.com/cd/E16338_01/server.112/b56311/dynviews_3016.htm

OracleR Databaseリファレンス V$LOCK
https://docs.oracle.com/cd/E16338_01/server.112/b56311/dynviews_2027.htm