SELECT ~ FOR UPDATE SKIP LOCKED その1 - @sh2ndさんのエントリの復習など Tweet
JPOUT Advent Calender 2013の@sh2ndさんのエントリーが面白かったので大晦日に酒飲みながら... :)
まずは twitterでのやり取りなど....


イケテナイとか、良いとか、自由に言えるのはユーザーだからこそだと思うんだ。
セールストークじゃない生の情報って大切だ。
ということで、skip locked へ行く前に、Oracle11g R1 11.1.0.7.0 および、Oracle12c R1 12.1.0.1.0 で @sh2ndさんのエントリーの復習から :)
※セッション1
SESSION1> select * from q order by id;
ID DATA
---------- ----------
1 a
2 b
3 c
※セッション1
SESSION1> SELECT id, data FROM q WHERE id = (SELECT MIN(id) FROM q) FOR UPDATE;
ID DATA
---------- ----------
1 a
※セッション2
SESSION2> SELECT id, data FROM q WHERE id = (SELECT MIN(id) FROM q) FOR UPDATE;
(ここで待たされる。待つことは正しい動き)
※セッション1
SESSION1> DELETE FROM q WHERE id = 1;
1行が削除されました。
※セッション1
SESSION1> commit;
コミットが完了しました。
SESSION1>
※セッション2はここでロックを獲得できる。
ID DATA
---------- ----------
2 b
SESSION2>
Oracle11g R2 11.2.0.1.0とOracle11g R2 11.2.0.2.0は、Wrong Resultだったんだと思うが...
※セッション1
SESSION1> select * from q order by id;
ID DATA
---------- ----------
1 a
2 b
3 c
※セッション1
SESSION1> SELECT id, data FROM q WHERE id = (SELECT MIN(id) FROM q) FOR UPDATE;
ID DATA
---------- ----------
1 a
※セッション2
SESSION2> SELECT id, data FROM q WHERE id = (SELECT MIN(id) FROM q) FOR UPDATE;
(ここで待たされる。というところまでは同じ)
※セッション1
SESSION1> DELETE FROM q WHERE id = 1;
1行が削除されました。
※セッション1
SESSION1> COMMIT;
コミットが完了しました。
SESSION1>
※セッション2 (注1
(しか〜〜〜し、なんとレコードが選択されませんでした!!!!!)
レコードが選択されませんでした。
SESSION2>
結果 Oracle READ COMMITTED 11.1.0.7.0 ID=2を取得 11.2.0.1.0 空振り 11.2.0.2.0 空振り 12.1.0.1.0 ID=2を取得
注1)
Oracle11g 11.2.0.3.0以降では修正されているとのこと...(私は手持ちのが無かったので未確認...だれか書いてw)
SELECT ~ FOR UPDATE SKIP LOCKEDへつづく...
| 固定リンク | 0


コメント