Yuriko.Net 個別記事

2006-05-16
雨

大バグ発覚

ゆりこ による 21:12:00 の投稿
カテゴリー: ソフトウェア

試しに作ってみた参加表明掲示板 (未公開) ですが、大バグが発覚しました。ほぼ同時に参加表明を投稿するとダブってしまうという問題です。

従来バージョンは、データーファイルには重複を許して追記させておき、表示のときに重複を除去していました。しかし、PHP + MySQL バージョンでは、データーベースへの追加のとき、新規登録 (INSERT) か、更新 (UPDATE) かを判断させました。しかし、新規登録であると判断してから INSERT クエリを発行する間に、同じ名前・メールアドレスでの投稿処理をすると、そちらでも新規登録と判断されてしまってダブってしまいます。つまり、新規か更新かの判断と、INSERT は、アトミックな処理 (分割できない処理) なのに、そうなっていないのが問題なのです。

これを修正するには、プログラムの流れ自体をいじらないといけないので、けっこうやっかいです。LOCK TABLES クエリを使う手もありますが、今回は、名前に UNIQUE 制約を付与しておき、いきなり INSERT IGNORE を発行させることにしました。これだと、新規登録であれば1行追加され、すでに同じ名前があれば 0 行追加 (追加されない) となります。追加された行数を調べて、0 行であれば改めて UPDATE を発行すればいいわけです。

ところが、すでに同じ名前があるとき PHP が異常終了 (Segmentation Fault) してしまいます。同じ名前がない場合は INSERT が成功するのにーー。うーん。弱った。

トラックバック・コメント

コメントはありません。

上に戻る

ごめんなさい。現在コメントフォームは閉じられています。

上に戻る