やりたかったいこと
DBはOracle。
異常系のテストがやりたくて、外部でレコードロックしかけてから対象コードを動かしたい。
もちろんUnitテストなフレームワークを使って。
詰まったこと
想定外のところでロックされているらしく、どっかでロック解除待ちになってテスト実行が途中で止まってる。
調査してみる
とりあえずどこで止まってるのか確認。
ロック解除待ちっぽいのはわかったのでほんとにそうか?を念のため確認する。
テストコードも途中で止まったままなので、とりあえずkillできるようにSIDとSERIAL#は欲しい。
引っかかってるSQLが何かわからないので、そいつもあるといい。
select SQL_ID, SID, SERIAL#, USERNAME, STATUS, SERVER, SCHEMANAME, PROGRAM FROM v$session WHERE SID IN (SELECT SID FROM V$LOCK);
詰まってるやつがいることがわかる。。。
やっぱりいた。
ではどのSQLがつまってるの?
先ほどのSQLで「SQL_ID」を抽出しているのでそれを使う。
select SQL_TEXT from v$sqlarea where SQL_ID = '[先に抽出していたSQL_ID]';
これでどのSQLがロック解除待ちにひっかかってるのか判明!
対処して終わり
ロック解除待ちのままになっているSQLがわかればどのオブジェクトがロックされっぱなしなのかがわかるので、そのロックを取得している処理を探して改修したら終わり。