【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のセッションに止められてますよ」というふうに解釈できるのである。