はじめに
Oracleのテーブルをロックするようなプログラムを作成中に、ロールバック処理に不備があるとテーブルがロックされたままになってしまいます。
こうなってしまった場合に、ロックしているセッションを強制的に終了させる方法をまとめました。
機能で学ぶ Oracle Database入門
posted with amazlet at 14.06.16
翔泳社 (2013-10-30)
売り上げランキング: 23,228
売り上げランキング: 23,228
ロックしているセッションを特定する
ロックをつかんでいるセッションを特定するには、以下のサイトに記載されているSQLを使います。
このSQLでは、テーブルをロックしているセッションのSIDとシリアルNoを知ることができます。
ロックしているセッションを終了させる
セッションのSIDとシリアルNoが分かったら、以下のSQLでセッションを強制終了させます。
--alter system kill session 'SID,シリアルNo' IMMEDIATE; alter system kill session '22,164' IMMEDIATE;
実際やってみる
1.SQL*Plusをたちあげて、table01テーブルをロックします。
select * from table01 where id = '1' for update;
2.sysユーザでログインして、テーブルをロックしているセッションを特定します。
conn sys/OraclePW1234 as sysdba SELECT object_name, oracle_username, s.sid, s.serial# FROM v$locked_object l, dba_objects o, v$session s WHERE l.OBJECT_ID = o.OBJECT_ID AND l.SESSION_ID = s.SID AND object_name = 'TABLE01' ;
3.SIDとシリアルNoを指定して、セッションをkillします。
alter system kill session '22,164' IMMEDIATE; >システムが変更されました。
ちなみに、セッションをkillされたプロセスは接続が切れた状態になるため、コンソールから何かしようとした場合は、以下のようなメッセージが表示されます。
select * from table01 where id = '1' for update * 行1でエラーが発生しました。: ORA-03113: 通信チャネルでend-of-fileが検出されました プロセスID: 2288 セッションID: 22、シリアル番号: 179