2017-06-09 8 views
1

次の問題があります 私はユーザーがいます。ユーザーにはデータベースの列があります - チケット。 - チケットは社内通貨です。 ユーザーがウェブサイトをクリックしたとき - webapi ===> BL(クラスライブラリ)マルチリクエストからの保護 - WebAPI

私はチケットを持っていますか? DALに - そしてこのカウンターを下に置く)。

問題は - 私がボタンを押してウェブサイトをクリックすると - とても速く - 私は2回買うことができます。

ユーザーは1枚のチケット

彼は何かを購入したい持っている - 価格1枚のチケット

ユーザーがボタンの上に高速の2回をクリックし

1要求 を買いますWebApiに行く==> BLに行く==> BlはDALユーザーからDBから取ってきてチケットがあるかどうかチェックする---はいHE HAS ===>ロジックとpを行う0

2要求WEBAPIに 移動にUTチケットカウンター==> BLに行く==> B1をDBからDALユーザーから取得し、チェック、彼はチケットを持っている場合--- YES HEはここを持っている問題であり、 ===>ロジックを実行してチケットカウンターを0にする

このバグからどのように保護されているかわかりません。

+0

ORMにstraight ado.netを使用しているのかEntity Framework(または何か他のもの)を使用していますか?私が尋ねる理由は、Sql Serverにバージョニング行を使用するオプションがあり、EFがこれを利用して並行性チェックを提供できるということです。あなたがado.netを使用している場合でも、これを利用することはできますが、手動で実装する必要があります。 – Igor

+0

EF 6.0を使用しているIm – Alex

+0

複数のボタンイベントを処理できない場合は、最初のクリック後にボタンを無効にすることができます。 –

答えて

0

処理中にBUYINGステータスを保持する一時変数を作成します。 この変数には、処理するユーザーIDが含まれています。以下のような

何か:

 ' At the click... 

     If UserBuyingNow is nothing 
     UserIsBuying = User_ID 
     ... 
     (proceed to your logic) 
     ... 
     (at the end, clear the status variable) 
     UserIsBuying = null 
     else 
     (user is already buying) 
     exit 
     End If 

はまた、購入しながら、TRUEで、一時的なフィールドを設定するにStoredProcedureを使用してSQL上で動作すると、プロセスの終了時に、そのフィールドをクリアするために、別のStoredProcedureを呼び出すことができます。

とにかく、ロジックは上記と同じですが、データベースレベルです。

3

複数の同時更新が1つしか成功しないように更新ロジックを変更する必要があります。例えば

あなたのDBテーブルがTicketIdTicketCountフィールドを持っている場合、あなたは残りのnチケットを持っていることがわかり、そしてあなたは、チケットの数を増減したい、というよりも、この

UPDATE Ticket 
SET [email protected] 
WHERE [email protected] 

をやって

複数のスレッドから2番目の更新を同時に実行すると、1つの行のみが更新され、1つの行が更新されます。他のすべてのスレッドは、この要求がゼロ行を更新していることを認識します。彼らは失敗の兆候としてそれを取る必要があり、対応するステータスコードをWeb APIの呼び出し側に返します。

私は、あなたはあなたのために自動的に同様のことをしている、EF 6 implementation of optimistic concurrencyに頼ることができEF 6.0

を使用しています。

+0

OPはEntity Frameworkを使用しているので、オプティミスティックな並行処理をサポートしており、(一部の構成で)このような更新クエリを生成し、同時実行競合(更新された0行)に関する例外を生成することができます。 – Evk

+0

@エヴァークありがとう、私はそのコメントは見ませんでした。 – dasblinkenlight

関連する問題