プロが教えるわが家の防犯対策術!

SQLServerにおける、排他制御に関して質問です。

環境:
 SQLサーバ
 ・Windows 2003 Server SP2
 ・SQL Server 2005 Standard Edition SP3

 SQLクライアント
 ・WindowsXP SP3
 ・.NET Framework 3.5 SP1 VB.NET アプリ

 DBアクセサ
 ・ADO.NETを利用

----------------------------------------------------------------------
1.DBとのコネクションを確立
       ・
       ・
       ・
2.データベーストランザクションを開始(レベルはSerializable)
3.テーブルAに対してINSERTを実行
  (テーブルAの主キーはオートインクリメント設定されている。)
4.3の結果、追加された主キーを取得するため、MAX()関数にて主キーの最大値(つまり、3で追加した行のはず)を取得
5.テーブルAを外部参照しているテーブルに対して、4で取得したテーブルAのキーを利用して、行を追加・更新などを行う。
6.コミットを行う。

  (コネクションは、アプリケーションが終了するまで保持する・・・)

----------------------------------------------------------------------

この処理フローで実行していたシステムですが、
二つのクライアント(X,Y)から、同時に2からの処理が行われた際に排他されず、
Xが、Yが作成したレコードの主キー値を元に、5の更新を行ってしまいました。

ログを見ると、
2→成功
3→成功(別のレコードが作成された)
4→XがMAX関数にて、Yが作成したレコードの主キーを取得
  ※処理そのものは成功しているが、論理的におかしい

となっています。



論理的には、トランザクションをかけているので、3からの処理が同時に行われるはずはなく、
4で取得される番号も、それぞれが作成した行の主キー番号になるはずなのですが・・・。


論理的に見落としている点や、環境的な要因などで、考えられる原因はありますでしょうか・・・?

A 回答 (1件)

insert ~;select scope_identity();



3,4を同時に行う


http://social.msdn.microsoft.com/Forums/ja-JP/sq …
    • good
    • 0
この回答へのお礼

教えていただいた方法で問題が解決しました。
ありがとうございます。

お礼日時:2010/06/30 19:57

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

関連するカテゴリからQ&Aを探す