掲示板の同時投稿 - PHPプロ!Q&A掲示板

1248

  • 0P

掲示板の同時投稿

質問日時 / 2008年6月19日 12:46    回答数 / 2件

Questioner:  ma_zu  このエントリーをはてなブックマークに追加 

キーワード / 掲示板   

PHP4.3.6+PostgreSQL7.4.14で掲示板が現在動作中です
DBへ記事を登録するときにその記事のIDを、DBのIDフィールドの最大値+1で確定してから
DBへ登録するのですが
コンマ数秒のレベルまで同時に登録をした場合、IDが重複してしまう現象が発生します

IDをprimary keyにすればよいのでしょうが、テストでテーブルをコピーして設定しようとして
IDの重複エラーが出たので設定できません
また同時に登録した場合どうなるのかもわかりません(多分DBからエラーを返す?)

既に数万件のデータがあり、重複のチェックと修正をするのは厳しいのでできれば今後発生しないように
PHP上で対応したいと考えています

IDの取得タイミングを登録処理のなるべく最後にもっていったりしましたが
それでもコンマ数秒まで同時に登録した場合の根本的対策にはなっていないと思います

他に考えたのは別テーブルに登録処理中のフラグを持たせ、フラグがたっている場合は登録処理を中断・待機させる
などですが、これもほとんど同時に登録処理をした場合は同じ結果になるだろうと判断しましたのでやめました

他に何かいい方法はないものでしょうか

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01kaitauこんにちは。 この手の処理は、PHPでも頑張れば多
 ┗A01-1ma_zukaitauさんありがとうございます シーケンスを利用す

回答一覧

並び替え:

A01 満足
answererkaitau [6月19日 13:58]

こんにちは。

この手の処理は、PHPでも頑張れば多分出来るのでしょうが、
それよりはDBの機能に任せるのが一般的だと思います。
PostgreSQLに限らず、メジャーなDBの多くは使用方法こそ違えど
シーケンスを実装しているので、これを使うほうが得策でしょう。
シーケンスというのは大雑把に言えば発番されるごとにカウントアップしていき、
セッションやトランザクションに関係なく一意な番号を発行する仕組みのことです。
(詳しくは別途調べてみてください)

大まかな流れで行くと、
あらかじめcreate sequence 何たら でシーケンスを作ったうえで、
記事投稿時に、insertを行う前に
select nextval(何たら) 
を発行して、一意の番号を得たうえで、それをinsertするレコードの主キー値に設定する
ということになります。

シーケンスにも問題が全くないわけではないですが、普段の運用に
気にする問題は殆ど出ないので、必要であれば別途調べて確認してみてください。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerma_zu [6月19日 15:01]

kaitauさんありがとうございます
シーケンスを利用する仕組みにしてみました

同時登録のテストをして問題なさそうなので、しばらくこのままで様子見になります

貴重なご意見有難うございました

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)