シナリオ:
複数のアカウントを持っています。すべてのアカウントには残りのクレジットがあります。すべてのアカウントは複数のユーザーに対応しています。
RemainingCreditフィールドに残りのクレジットを正しく反映させたい(EFを使用してdbを抽象化しています)。
EG初期クレジットがXで、2人のユーザーがログインし、1人がAを使用し、もう1人がBを使用するシナリオでは、最終合計をXABにします(読み取り/変更/保存の順序は関係ありません)。
読んだ後、楽観的同時実行処理は私が探しているものだと思います。それはうまくスケーリングし、これは私のシナリオにとって非常に重要だからです。終了手順は次のようになります。
ComputeRemainingCredit(Double amountToBeDeducted) {
Account acc = context.Accounts.Where(condition)
ComputeRemainingCreditInternal(acc, amountToBeDeducted);
}
ComputeRemainingCreditInternal(Account acc, Double amountToBeDeducted) {
try {
acc.RemainingCredit = acc.RemainingCredit - amountToBeDeducted;
context.SaveChanges();
}
catch (OptimisticConcurrencyException ex) {
context.Refresh(RefreshMode.StoreWinds, acc);
//now I need to rerun the operation
ComputeRemainingCreditInternal(acc, amountToBeDeducted);
}
}
- これはEFでの楽観的並行性の正しい解釈/実装ですか?
- 私の最終的な目的は、RemainingCreditフィールドを最新の状態にすることです。OptimisticConcurrencyExceptionよりも優れたソリューションはありますか?