2010年12月 5日

[pgsql-jp: 40591] Re:グループ毎に自動採番したいのですが

2010/12/5 yukihito miso <mail@xxxxx>:
> -- IF NOT FOUND
> -- ? FIXME: u_idごとの最初の行の時には別のロックが要る?
> -- END IF;
> は、どうしてこの処理"別のロック"が必要になるのでしょうか?

ある u_id に対して行を追加する際には
>> ?PERFORM 1 FROM users WHERE u_id = 1 AND s_id = 1 FOR UPDATE;

として毎回 (u_id, s_id) = (<値>, 1) を行ロックすることで、
平行して追加があった際に同じ値の s_id を追加することを防いでいます。

ところが、初回、つまり s_id = 1 を追加する際には、まだ行ロック
対象の業が無いので、排他制御ができません。これがコメントの意図です。

ただ、初回の追加時は u_id をシーケンスから生成するはずなので、
並行で (同じ u_id, s_id = 1) を挿入することは無い気がします。
実際には、気にしなくても良いケースが多いと思われます。
(元メールの「アプリ的にも特別扱い」は、このことです。)


>> INSERT INTO users (u_id, s_id) VALUES (<値>, DEFAULT);
> というののINSERT文ですが
> DEFAULTにmax(s_id)+1の値が入るという動作でいいのでしょうか?

「どんな値を指定しても、トリガで強制的に上書きされる」イメージです。
DEFAULTでなくても構いませんが、0 等の特定の値を与えるよりは
しっくりくる気がしたので、DEFAULTにしておきました。

--
Itagaki Takahiro

投稿者 xml-rpc : 2010年12月 5日 16:54
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/100585
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。