RM-BLOG

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【ORACLE】V$SESSION.BLOCKING_SESSIONについて

Oracleの公式のマニュアルみたいのを見ると
「V$SESSION.BLOCKING_SESSIONにはブロックしているセッションの情報が出力される」
といった内容のことが書かれているが、
主語がないので自セッションから見て
・他セッションにブロックされているのか
・他セッションをブロックしているのか
の判断がつかない。
そしてなんとなく俺は"ブロックしている"という単語だけ見て
「そのセッションは他セッションをブロックしているよ(そのセッションのSIDはこれだよ)」という内容が
V$SESSION.BLOCKING_SESSIONに出てくるのかと思っていたが、どうやら違うようだ。
正しくは「俺はそのセッションにブロックされているよ」のSIDが出力されるようである。

つまり自セッションブロックしているセッションの情報が出力される
という意味になるようだ。
(わかりづれえ…これOracle的にはいちいち書くまでもない常識なのかな?)


例えばセッション100として以下のようなSQLが投げられたとする
SELECT
   *
FROM TEST_TABLE
WHERE TEST_ID = '1'
FOR UPDATE -- ←これで掴む
;
次いで別セッション200で同一テーブル同一レコードに更新かけようとする
UPDATE TEST_TABLE
SET    TEST_VALUE = 10
WHERE TEST_ID = '1'
;
200より前に100がFOR UPDATEで掴んでいるので
200のUPDATEは100のロック解放待ちとなるわけだが
このときV$SESSION.BLOCKING_SESSIONは
SIDV$SESSION.BLOCKING_SESSIONの値
100null
200100
という感じになるわけだ。
つまりV$SESSIONにおけるSID=200のレコード上だけみると
「SID200のセッションはSID100のセッションに止められてますよ」というふうに解釈できるのである。