Oracleでトランザクションロックを解除する流れの覚え書き。
環境
- Oracle Database 21c
手順
(1) トランザクションロックのかかっているテーブル情報の確認
以下のクエリを実行し、トランザクションロックのかかっているテーブル情報を確認します。
SIDとSESSION#は(2)で使うので、トランザクションロックを解除したいテーブルのものを控えておきます。
なお、DO.OWNERがスキーマ名、DO.OBJECT_NAMEがテーブル名になります。
-- 全ロックを表示: ロックしているもの
SELECT DO.OWNER || '.' || DO.OBJECT_NAME AS OBJECT,
DECODE(LO.LOCKED_MODE,
1, 'NULL',
2, '行共有(SS)',
3, '行排他(SX)',
4, '共有(S)',
5, '共有行排他(SRX)',
6, '排他(X)',
'???' ) AS LOCKED_MODE,
TO_CHAR(L.CTIME / 60,'99990.9') AS MIN,
LO.ORACLE_USERNAME,
LO.OS_USER_NAME,
LO.PROCESS,
S.SID,
S.SERIAL#
FROM DBA_OBJECTS DO, V$LOCKED_OBJECT LO, V$LOCK L, V$SESSION S
WHERE DO.OBJECT_ID = LO.OBJECT_ID AND
LO.SESSION_ID = L.SID AND
LO.XIDSQN = L.ID2 AND
LO.PROCESS = S.PROCESS AND
LO.XIDUSN > 0;
(2) SESSIONのKILL
(1) で控えておいたSIDとSESSION#を使って、SESSIONをKILLします。
-- SESSIONをKILLする: [例] SID = 177, SERIA#L = 4335 の場合
ALTER SYSTEM KILL SESSION '177,4335';
上記のDDL文実行には、ALTER SYSTEM システム権限が必要です。
実行ユーザーに権限がない場合は、SYSTEMユーザから以下のDCL文を実行して権限を付与して(もらって)ください。
-- ユーザー: ELEONORAに権限を付与する場合
GRANT ALTER SYSTEM TO ELEONORA;
これで、トランザクションロックが解除される(はず)
参考
本記事の内容は、以下のページたちの組み合わせ。
先人の皆さまに感謝!
- 全ロックを表示する方法(ロック時間付き)| www2.odn.ne.jp
- OracleのFOR UPDATEの排他ロックを解除する | きり丸の技術日記
- Oracle 特定のセッションをKILLする | コピペで使う
なお、関連するテーブルの公式リファレンスのページは、以下の通り。