DOBON.NET DOBON.NETプログラミング掲示板過去ログ

行ロックのかけ方について

環境/言語:[WindowsXp VB.NET]
分類:[.NET]

いつもお世話になっています。

早速質問なのですが、ADO.NETを利用してSQLServer2000にアクセスしているシステムがあります。

今、問題になっているのが採番テーブルの更新です。
処理は以下のようになっています。

1.採番テーブルから採番する
2.採番した番号で新規データを登録する
3.採番テーブルの採番を+1して更新する

この処理だとほぼ同時に採番をおこなった場合に、
同一の採番をしてしまってエラーになることがあります。

1.の処理のところで採番テーブルにロックをかけたいのですが
どのようにおこなえば良いでしょうか?

自分なりに調べたところSELECT文にWITH句をつけて行ロックができそうなのですが、
トランザクション内でSELECT文の発行ができずに困っています。

よろしくお願いします。
> 今、問題になっているのが採番テーブルの更新です。

行ロックとは別の解決策として、このあたりを参考にしてみるとか。
http://msdn.microsoft.com/library/ja/dnadonet/html/manidcrisis.asp
魔界の仮面弁士さま、ありがとうございます。

ID列の使用も検討したのですが、採番Noは主キーでないことや、
あるタイミングで採番Noを1に戻すことがあるため使用は無理と判断して
現在の形式のテーブル構造になっています。
■No15450に返信(namさんの記事)
こんにちはっす。

> トランザクション内でSELECT文の発行ができずに困っています。

これだけでは、どういう状況なのか把握できないので、
処理ロジックなどを説明していただけますか?

たとえば、
Webシステムの1ページ目の入力画面で番号の採番をし、
2ページ目の確認画面にある登録ボタンを押下したら
1ページ目で採番した番号を使って確認画面に表示されているデータの登録を行うとか・・・・
#↑この例は、
#きっとこんなパターンだったら、採番と登録のトランザクションが違うから
#できないって話になるであろうなぁって推測です。
> トランザクション内でSELECT文の発行ができずに困っています。
>

できると思いますが。
夏椰様、medaka様 返答ありがとうございます。

表題の件ですが、処理の順番を変更することで解決できました。

1.トランザクション開始
2.採番テーブルを更新する。
3.採番Noを取得する
4.トランザクションコミット

これで、重複のキーを発行することがなくなりました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板