【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は
SID | V$SESSION.BLOCKING_SESSIONの値 |
---|---|
100 | null |
200 | 100 |
つまりV$SESSIONにおけるSID=200のレコード上だけみると
「SID200のセッションはSID100のセッションに止められてますよ」というふうに解釈できるのである。