■81893 / inTopicNo.1) |
レコードのSELECT,UPDATE処理時の排他制御について |
□投稿者/ あさ (7回)-(2016/11/19(Sat) 10:33:09)
|
分類:[ASP.NET (VB)]
2016/11/19(Sat) 13:14:38 編集(投稿者) 2016/11/19(Sat) 11:04:51 編集(投稿者)
レコードのSELECT,UPDATE処理時の排他制御について
お世話になります。 ASP.NET(VB),Windows10,SQLServer2014で開発しています。
ある予約システムを作成しています。 以下のような予約一覧テーブル(分かりやすくするために簡略化します)があるとします。 予約Noはオートナンバーです。
予約一覧テーブル 予約No 部屋No 氏名 10000 1 鈴木 10001 2 山田 10002 3 佐藤
新たに予約を行う際には、いきなりUPDATEではなく、 まずは部屋NoのMax値(ここでは3)をSELECTして、 +1をして、部屋数の定数内であることを確認し、それから、 UPDATE(INSERTによる)します。
一般的に、テーブル更新時の排他制御はASP.NETの場合、 更新時のオプティミスティックロックで行うとのことですが、 部屋Noは主キーではないため、 以下のような同時更新が成立してしまうのではないかと考えます。
予約No 部屋No 氏名 10000 1 鈴木 10001 2 山田 10002 3 佐藤 10003 4 木村 10004 4 森田
こうなってしまいますと、部屋No=4が重複していまい、ダブルブッキングになってしまいます。
そこで、他のユーザーがSELECT,UPDATE(INSERTによる)のトランザクション処理を行っている間は、 他のユーザーは待機する、ようにしたいのですが、 (これはペシミスティックロックということになりますでしょうか) 今現在他のユーザーが処理中であるということを他ユーザーが知るための実装方法には、 どのようなものがありますでしょうか。
不勉強で申し訳ありません。
どうぞよろしくお願いします。
※例えば、すごく単純ですが、このような方法はいかがでしょうか。 この目的のためにApplication変数を使うのは、 サーバーへの負担が大きいでしょうか。
SELECT,UPDATE(INSERTによる)処理に、 以下のコードを加える。
If Application("yoyakutyu") IsNot Nothing Then If Application("yoyakutyu")="他のユーザーが予約処理中" Then MsgBox("ただいま他のユーザーが予約処理中です。") Exit Sub End If Else Application("yoyakutyu")="他のユーザーが予約処理中" (SELECT,UPDATE(INSERTによる)処理) Application.Remove("yoyakutyu") End If
|
|