SELECT ~ FOR UPDATE SKIP LOCKED その2 Tweet
つづきです。
そういえば、skip lockedって構文がマニュアルでは解説されていないリリースででふつーーーーに、使われててビビったことあったな。
(マニュアルに書かれていないリリースでは、自己責任使ってねw)
・Oracle12c R1 - SKIP LOCKED
http://docs.oracle.com/cd/E49329_01/server.121/b71278/statements_10002.htm#SQLRF55374
・Oracle11g R2 - (skip locked、推奨事項などが追記された)
http://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_10002.htm#i2126016
・Oracle11g R1 - (skip locked登場)
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-03/statements_10.htm#7292
・Oracle10g R2 (ここまでのマニュアルにはskip lookedは記載されていない。AQがらみで使われていたのは確かだ....)
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19201-02/statements_10.html#6799
どのあたりのバージョンから登場していたのかはJonathan Lewisさんのブログからたどれば分かると思うよ...
http://jonathanlewis.wordpress.com/2010/05/31/skip-locked/
Oracle11g R2のドキュメントからは以下のような追記されている。
「この機能は、Oracle Streams Advanced Queuingなどのマルチコンシューマ・キュー環境で使用するために設計されています。
キュー・コンシューマは、他のコンシューマによってロックされた行はスキップして未ロックの行を取得できるので、
他のコンシューマの操作が終了するまで待つ必要はなくなります。
SKIP LOCKED機能を直接使用するかわりに、Oracle Streams Advanced Queuing APIを使用することをお薦めします。」
と。
以下のリリースで確認したが skip lockedに関して動作の差は無いようだ。
2013/1/5追記
動作の差は無いようだ、とは書いたが、結果オーライってことでございます。内部動作までは見えないので(キリつ
・Oracle11g R1 11.1.0.7.0
・Oracle11g R2 11.2.0.1.0
・Oracle11g R2 11.2.0.2.0
・Oracle12c R1 12.1.0.1.0
※セッション1SESSION1> select * from q order by id; ID DATA---------- ---------- 1 a 2 b 3 c※セッション1SESSION1> SELECT id, data FROM q WHERE id = (SELECT MIN(id) FROM q) FOR UPDATE SKIP LOCKED; ID DATA---------- ---------- 1 a ※セッション2 SKIP LOCKEDなのでしようとしていたレコードがロックできなければ空振りし、ロック獲得を待機しません SESSION2> SELECT id, data FROM q WHERE id = (SELECT MIN(id) FROM q) FOR UPDATE SKIP LOCKED; レコードが選択されませんでした。※セッション1SESSION1> DELETE FROM q WHERE id = 1;1行が削除されました。 ※セッション2 何度やっても同じですよね :) SESSION2> SELECT id, data FROM q WHERE id = (SELECT MIN(id) FROM q) FOR UPDATE SKIP LOCKED; レコードが選択されませんでした。※セッション1SESSION1> COMMIT;コミットが完了しました。SESSION1> ※セッション2 ここで初めて、対象レコードがロックできます! マルチコンシューマ・キュー環境向けって意味がよ〜〜〜〜く分かる動きだと思います SESSION2> SELECT id, data FROM q WHERE id = (SELECT MIN(id) FROM q) FOR UPDATE SKIP LOCKED; ID DATA ---------- ---------- 2 b
skip lockedって面白いよね。
skip lockedの特徴について、もう少し書く予定、多分、来年へつづく。。。。。
みなさま、良いお年を!
・SELECT ~ FOR UPDATE SKIP LOCKED その1 - @sh2ndさんエントリの復習など
| 固定リンク | 0
コメント