C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 140 を表示中)
■81893 / )  レコードの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


返信 編集キー/


管理者用

- Child Tree -