私の問題に少し背景を与えるために、私は非常に基本的な銀行システムを持っています。現時点では、プロセスが行く:複数の更新を1つのdbフィールドに処理する
- 取引はAzureのサービスバスに追加され
- アンアズールWebjobは、このメッセージをピックアップし、SQL DBに新しい行を作成します。
- アカウントの残高(合計)をメッセージの値(+または - )で更新する必要があります。
たとえば、フィールドが10で2つの更新(10、-5)が得られた場合、フィールドは15(10 + 10-5)でなければなりません。値を更新するだけではありませんいくつかの算術演算を行う必要があります。
ここで、多くのリクエストが入る可能性があるので、残高の更新を処理する方法があまりにもわかりません。それに応じて更新する必要があります。
私は、WebジョブではなくSQL側で更新を行うことを考えましたが、これは同時更新では役立ちません。
フィールドでロックすることはできますか?しかし、更新が既に進行中であるためにブロックされた場合、更新はどうなりますか?それは待っているか失敗していますか?待っていればOKです。私はEFを使用しています。
これは別の方法で考えました。これはスケジュールで実行される別のWebJobを持っていて、すべての金額を加算して一度値を更新するので、そのフィールドに触れる唯一のものになります。
おかげ
どのデータベースを使用していますか? –
@ReenactorRob私はAzureでSQL DBを使用しています。私はそれを指定する質問を更新しました。 – ADringer
多くの更新文が高速に実行されないようにするには、30秒間の数値を集計して合計し、dbの現在の残高に加算するジョブを実装することができます。次に、次の30秒間の値を再度集計し、dbの残高値に加算します。この方法では、データベース内のトランザクションが少なくて済み、正しい計算が行われます。 –