こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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で取得される番号も、それぞれが作成した行の主キー番号になるはずなのですが・・・。


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

投稿日時 - 2010-06-30 18:09:34

QNo.6006223

すぐに回答ほしいです

質問者が選んだベストアンサー

insert ~;select scope_identity();

3,4を同時に行う


http://social.msdn.microsoft.com/Forums/ja-JP/sqlserverja/thread/55e7d50e-ecfb-47ec-9671-8a55801a97c8

投稿日時 - 2010-06-30 18:32:51

お礼

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

投稿日時 - 2010-06-30 19:57:32

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)