トップページ⇒tech
62コメント28KB

ASP+SQL Serverで切実に困ってます。

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
自分で本やWebを調べたんですけどわかんなくて・・・
たぶんすっごい基本的なことだと思うんで知ってる人いたらタスケテ。

ASP+MS SQL Serverで作ったWebのサービスに異常発生。
調べてみたらユニークでなきゃいけないIDがかぶってました。
どうやら
1.一番大きいIDを引っ張ってくる。
↓
2.それに+1する
↓
3.+1したIDをつけてINSERT。

っていうところで1→3が終わる前に他のユーザが1の処理を
はじめるとIDがかぶるってことがわかりました。
(ためしに自分で2台同時にボタンおしたらかぶりました)

会社でほかにわかる人がいないので凄い基本っぽい気がする
この問題が解決できません(涙
ロックとかトランザクションって調べたんですけどいまいち意味がわかってない
せいかうまくいきません。
17日の正午までメンテナンス中っていうページに差し替えて
しのいであるんだけどこのままじゃ・・・。
005527NGNG
>>50
Oracle の ROWNUM って、使える演算子は <, <= の二つだけだぜ。
0056仕様書無しさんNGNG
>>54

ふたつのセッションで同じ値の max (仮に10とする) を取得してしまったとしても、
そのうちのひとつのセッションで、先に dummy = max + 1 ( dummy = 10 + 1 ) に
書き換えれば、dummy = 10 の行は存在しなくなるでしょ。
もうひとつのセッションで dummy = 10 の行への書き込みを試みても、そんな行は
もうないから、書き込みは行えないというわけ。
0057デフォルトの名無しさんNGNG
すみません、教えてください。ASPからMSDEにアクセスしているのですが、DBのデータが大量にあり、
複数のクライアントからアクセスすると、「容量を超えていたため、
新規トランザクションを作成できません。」というエラーが返ってきます。
そこで、もしMSDEのトランザクション領域(デフォルト)のサイズをご存知の方が
いらっしゃいましたら、教えていただけないでしょうか?
よろしくお願いします。
0058縞栗鼠(シマリス)の親方NGNG
中央高等学院の従業員「西部」が女子トイレに闖入し
汚物入れを物色して女子生徒の使用済みタンポン・ナプキン等を
個人的に収集しているというのは事実。

中央高等学院では
生徒及びその保護者の個人情報を名簿図書館等に売却しています。
中央高等学院 http://chs-f.com/index.html 中央高等学院福岡校
http://www.chuo-school.ac/
0059名無しさん@EmacsNGNG
>>44
FAQなのレス。

(>50だと期待する結果にならんと思われ。
WHERE句のROWNUMは条件が入るとみんな偽になってしまうので。)

11件目から5件ってことは11件目から15件目を取得すればいいので、

SELECT * FROM syohin WHERE tanka < 10000 AND ROWNUM <= 15
MINUS
SELECT * FROM syohin WHERE tanka < 10000 AND ROWNUM < 11

つまり、15件以下のデータから10件以下をマイナスすればいいのレス。
0060名無しさん@EmacsNGNG
ごめん。ageてしまった...

あと、間違ってた...鬱だ...

最後は ROWNUM < 11 ですわな...
0061デフォルトの名無しさんNGNG
こういうのは、MAX+1を取ってくるんじゃなくて、SELECTのタイミングで
MAX+1に適当なダミーデータを放り込んでおいて、INSERTの変わりにUPDATE
すべきかと思われ。

SQL*Serverにあるのかどうか知らんが、SWQENCEつかうのが一番いいとおもわれ。
0062デフォルトの名無しさんNGNG
>>1
方法1.1〜3をBEGIN TRANSACTIONとCOMMITで囲む。(これにより排他がかかる)
方法2.ユニークインデックスにして、重複エラー時は適当な時間をおいてリトライさせる。
方法3.1〜2を3のトリガー処理に書きSQL分を一つにする。トリガー処理は一意であるのでOKになる。

■ このスレッドは過去ログ倉庫に格納されています