既に同様の記事がありますが、自分の備忘録として残しておきます。
トランザクションをCOMMIT
したり、ROLLBACK
したりすると、FOR UPDATE
で行ったロックが外れます。しかし、デバッグしながら動作検証する等々でCOMMIT
もROLLBACK
もせずに処理を終了してしまうと、排他ロックをしたままになってしまい、対象のデータの処理ができなくなります。
今回の記事では、Oracleで排他ロックがかかりっぱなしになった時に、排他ロックを解除するためのコマンドを残します。
環境
- Oracle
- 11g
- Docker
使い方
次のSQLで排他ロックがかかっているSID, SERIAL#を調べます。
SELECT SID, SERIAL#, SADDR, MACHINE, USERNAME, PROGRAM FROM V$SESSION WHERE SID = ANY (SELECT SID FROM V$LCOK WHERE TYPE IN ('TX', 'TM'));
調べたSID, SERIAL#を元に、次のコマンドを実行します。カンマも含めて実行する必要があります。
-- ALTER SYSTEM KILL SESSION '{SID, SERIAL#}'; ALTER SYSTEM KILL SESSION '36, 2471'
終わりに
毎回、調べる際に地味に時間がかかってしまっていたので、ブログに残しておきます。Oracleが有償であることもあって個人では検証しないのですが、今後の現場でもOracleを使うことはあると思うので、機会があれば残しておきたいですね。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
参考記事