2016-08-02 1 views
1

私はユニークな商品しか持っていないショッピングウェブサイトで働いています。したがって、ユーザーは同じ商品を同時にカートに表示して追加することができますが、注文すると誰でも最初に配置するので、カートに同じアイテムが追加されます。特定のコードをロックする方法C#

しかし、私は、呼び出されたときに私のプレースオーダーコードがロックされ、他のすべてのリクエストが完了しなくなるまで待ち行列で待たなければならないことをどのように保証するのでしょうか。 私はlockキーワードについては読んだがあまり考えていない。どんな助けもありがとう。

ステップ1:

以下は私のコードのためにいくつかの手順を実行している、その項目が利用可能であるか確認するためにサードパーティのサービスを呼び出すことがない ステップ2:項目が利用可能な場合は、呼び出すことによって、それを買うことサードパーティのサービス。 ステップ3:正常に購入された場合は、フラグなどでデータベースを更新してください。

+0

コードのサンプルを提供してもよろしいですか? –

+0

基本的な設計上の欠陥があるようです。リクエストはお互いに干渉してはならないので、動作させるために何らかのロックを行う必要はありません。あなたのコードを見れば、何が間違っているのか理解するのに役立ちます。 – itsme86

+0

これは 'ロック'のためのものではありません。あなたが人のカートに入っている間に在庫を一時的に在庫から取り除く方法が必要です(私があなたの質問を正しく理解していれば)。私が考えることができる最善の方法は、カートをデータベースに入れることです。あなたは常にあなたの潜在的な株式が何であるかを確認するためにカートに照会することができます。 –

答えて

4

複数のWeb要求を異なるプロセスで実行できるため、Webサーバー上でコードを確実にロックすることはできません(少なくとも、 。

代わりに、データベースの変更が一度しか成功しないことを確認して、2回目の要求に対して正常に障害を処理する必要があります。データベースの変更は「自然に」アトミックなので、スマートな挿入/更新によって問題が解決されます。

+0

@mattis:データベースの更新だけでなく、外部APIもほとんど呼び出されていません。 – ChupChapCharli

+1

トランザクションを開始します。 dbの更新を行います。成功した場合は、外部apisを続行します。成功した場合は、トランザクションをコミットします。それ以外の場合は、ロールバックしてユーザーにエラーを表示します。 –

+0

ありがとうございます。アイテムが利用可能な場合にデータベース内のフラグを更新し、外部APIを使用して購入しようとしていると言います。トランザクションがロールバックされていない限り、そのアイテムが使用できないことを示す別のリクエストがある場合何らかのエラーによって。私が誤解した場合は私を修正してください。 – ChupChapCharli

関連する問題