電子書籍の厳選無料作品が豊富!

言語はColdFusion、データベースはpostgreSQL
サーバーはLinuxで会議室予約システムのWEBアプリケーションの開発を行っています。動作環境はIE6.0以上Javascriptが有効が前提)です。

ある特定のユーザーが登録する時だけ、2重登録が発生してしまいます。
テーブルには
予約ID(主キー)、場所、日時、仮予約NO(複数の場所・日時を一度に登録出来るので、グループ化するためのNO)を登録するのですが、予約IDと仮予約NOは一意のものなので、シーケンスで取得しています。ダブルブッキングは出来ないので場所と日時の組み合わせでかぶることはありません。
データはこんな感じに入っています。
予約ID|場所|日時   |仮予約NO
1    A  2005/6/1   1
2    B  2005/6/1   1 
3    B  2005/6/7   2 
4    C  2005/6/9   3
5    C  2005/6/9   4 
予約ID1~3は正常な登録ですが、4と5が場所と日時がかぶっているので、不正なデータです。予約IDと仮予約NOは違うのですが、同じ場所と日時の予約が出来てしまいます。
登録のSQLの前に2度、同じ場所と日時で登録がないかSQLでチェックをしているのですが、同じトランザクション内で登録が行われているようで、そのチェックにも引っかかりません。
登録画面には2度押し防止の為に、登録ボタン押下後はボタンを無効にしています。
IE以外のブラウザを使っているのかと思って調べたところ、ちゃんとIEを使用されていました。
JavaScriptが無効なのかとも思いましたが、有効になっていないと登録処理にまで、辿り着かない作りになっています。
クライアントでの2度押しのチェック強化方法とサーバーサイドでの2度押しのチェック、トランザクション内で同じSQLを発行させないような方法など、何かありましたら教えください。

A 回答 (2件)

とりあえず、「二重登録がどうして発生するか?」のメカニズムはわかりませんが..



二重登録という矛盾するデータをデータベースに登録できなくすることで、
問題が他に波及することは抑制できるハズです。
例えば、”場所+日時”のユニークインデックスを張るとか..

その上で、イレギュラーなケースが如何にして起こるのかを
じっくり対応すればよいかと思います。
    • good
    • 0

他の方から回答がつかないのは、それが難解な問題だからではなく、質問内容における説明が見当違いで、回答のしようがないからだと思いますよ。



質問者さんは、SQLが2回おきるのが異常だ、クライアント側での2度押し防止・・・と考えられているようですが、その検討は的外れのような気がしてなりません。

一番怪しいのは、2重登録をさせないための、同じ場所、同じ日時をチェックしているというSQL文、ロジックで単純ミスをしているためだと思われます。もちろんあいまいな状況説明から推測していますので、まったく別の原因かもしれません。

とりあえず実行しているSQL文、データベースのカラム構造などを詳細に明記してみてください。自分ではそんなミスはないと思っていても案外!!!なことがベテランでも往々におこります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!