※ ChatGPTを利用し、要約された質問です(原文:SQLServerにおける、排他制御に関して質問です。)
SQLServer排他制御に関する質問
このQ&Aのポイント
SQLServerにおける排他制御に関して質問です。トランザクション中に発生した問題について詳しく説明します。
トランザクション中に発生した問題について、SQLServerの排他制御について質問があります。詳細な事例とともに説明します。
SQLServerの排他制御に関する質問です。トランザクションが同時に実行された場合に起きた問題について解説します。
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で取得される番号も、それぞれが作成した行の主キー番号になるはずなのですが・・・。
論理的に見落としている点や、環境的な要因などで、考えられる原因はありますでしょうか・・・?
お礼
教えていただいた方法で問題が解決しました。 ありがとうございます。