【发布时间】:2012-12-10 13:43:10
【问题描述】:
场景:
我有多个帐户。每个帐户都有剩余信用。每个帐号对应多个用户。
我希望 RemainingCredit 字段正确反映剩余信用(我正在使用 EF 抽象出数据库)。
E.G. 在初始信用为 X 并且有 2 个用户登录的情况下,一个花费 A,一个花费 B ,我希望最终总和为 X-A-B(读取/修改/保存的顺序应该无关紧要)。
阅读后,我认为乐观并发处理是我正在寻找的,因为它可以很好地扩展,这对我的场景非常重要。 结束过程类似于:
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 更好的解决方案?
【问题讨论】:
-
这是我见过的最糟糕的并发使用。这不是您在数据库上进行基本数学运算的方式。只需查询即可。
-
想详细了解您的评论?如果我做错了——指出我做错了什么,这样我才能改进。只说我错了一点用都没有。
-
@mattmanser 你能否提供一个适合这种情况的 UPDATE 示例?
标签: c# entity-framework entity-framework-4 concurrency