ナスです。

RDS for Oracle (v11.2.0.4) のテーブルでずっとロックがかかっているものがあったので、調べたことを備忘録として書きます。

最初に試したのはこのクエリ。

SELECT SID, SERIAL# FROM V$SESSION
WHERE SID IN (
SELECT SID FROM V$LOCK
WHERE TYPE IN ('TM','TX')
);

実行してみると、全く反応が返ってこない…なぜだ…
そもそも V$LOCK の count だけでも反応が返ってこない。なぜだ…

仕方なく、V$LOCK を使うのをやめて、隣に座っている Oracle に詳しい師匠に聞いて下記のクエリに変えてやってみたら、1秒くらいで結果が返ってきました。

SELECT
  object_name,
  oracle_username,
  s.sid,
  s.serial#,
  to_char(s.logon_time,'YYYY/MM/DD HH24:mi:SS DAY'),
  s.program,
  sql_address
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 = 'テーブル名'
;

なんだろう。V$LOCK がおかしくなっているのかな。とりあえずワークアラウンドが見つかったので、良しとしよう。

元記事はこちら

Oracle のロックされているテーブルのセッションを知りたい [cloudpack OSAKA blog]