重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

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

ASPで作成した画面からSQLserver2005にデータ登録を行う場合に重複データができてしまいます。

データを登録するテーブルは、主キーが設定されていません。
テーブルには本来ユニークとなる受付番号があり、画面にて登録を行う際に、画面の受付番号がテーブルに存在するか、SQLのSELECTで検索してチェックを行った後、存在しなければ登録(SELECTしてaddNew)を行っています。
このテーブルにデータ登録を行う画面は複数あり、どの画面も上記と同じ処理の流れになっています。
このような処理の流れの場合で、同一の受付番号のデータが登録されるのはどのような場合があるでしょうか。
思いつくのは、複数端末で同一受付番号を同時に登録した場合課と思うのですが、それ以外に可能性はありますでしょうか。
詳しい方、よろしくお願いします。

A 回答 (2件)

原因はたぶん想像されている通りかと。


ASPは本質的に複数の同時接続を扱えるようにしていますから、それに対応できるようなプログラムの記述が必要です。

SELECTしてからAddNewまでを1つのトランザクションとするような記述ができれば問題は解決するかとおもいます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
質問後も調べていたのですが、原因は記述した通りしかないようでした。
回答内容を参考にプログラムを修正します。

お礼日時:2010/12/02 22:39

>複数端末で同一受付番号を同時に登録した場合


ご想像の通りでしょう。

気付いた点を述べますと、先ず、主キーが無いテーブルは
レコード数が増えた時に処理効率が悪くなります。
それと、テーブル結合した時の制約も多くなるので、やはり
主キーは設けるべきです。

>SELECTで検索してチェックを行った後
マルチユーザ環境ではあまり意味がありません。
採番テーブルを設けて採番中はロックするのが普通です。
ただ、ロックとその解除は速度が遅いこと、ロック中に障害が
あった時に、復旧が難しいDBシステムがあることから、私は
普通のファイル(中身なし)を排他的に開いてミューテックスの
ように使用しています。ファイルを開けなかったタスクは数回
リトライするようにします。
ファイルを開けたタスクは「SELECTを使って・・・」をやっても
他のタスクと衝突しないので安心して番号が採れます。
ファイルのOpen/Closeは処理が速く、障害で異常終了しても
OSが自動的に閉じてくれるので、復旧の必要はありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
テーブルに主キーを設定しないのは顧客からの要望で設定することはできませんでした。
回答内容を参考にプログラムを修正します。

お礼日時:2010/12/02 22:41

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