gpt4 book ai didi

c# - Entity Framework 处理并发

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:39 24 4
gpt4 key购买 nike

场景:

我有多个帐户。每个帐户都有剩余的信用额度。每个账户对应多个用户。

我希望 RemainingCredit 字段能够正确反射(reflect)剩余信用(我正在使用 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);
}
}
  1. 这是 EF 中乐观并发的正确解释/实现吗?
  2. 我的最终目标是使 RemainingCredit 字段保持最新。有没有比 OptimisticConcurrencyException 更好的解决方案?

最佳答案

您的表中需要一个字段作为时间戳或版本号,并将其用于乐观并发检查。

假设您有一个 Version 字段。将该字段的 ConcurrencyMode 属性设置为 Fixed,然后 EF 将为您执行乐观并发检查并在必要时抛出 OptimisticConcurrencyException

另一种方法是自己完成这项工作——获取当前记录,根据您正在更新的记录中的字段值验证字段值,相应地允许或禁止更新。

编辑 另见 http://blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic-concurrency-in-the-entity-framework.aspx

编辑或多或少的伪代码:

bool mustRetry = true;
while (mustRetry)
{
try
{
SpendTheMoney(context, parameters);
mustRetry = false;
} catch (OptimisticConcurrencyException exc)
{
// Do logging if you need, then just swallow the exception
}
}

关于c# - Entity Framework 处理并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13802152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com