You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编辑交易时如何正确扣除初始余额?.NET8 Blazor Server开发问题

解决Blazor Server中交易编辑时余额重复扣除的问题

我在.NET 8 Blazor Server开发的交易系统中,添加交易时余额扣除逻辑正常,但编辑交易时会出现重复扣除的问题:

  • 用户初始余额5000,添加1000交易后余额4000
  • 编辑该交易将金额改为1200,预期余额应为3800,但当前代码会计算成4000-1200=2800,相当于重复扣除了新金额

当前编辑代码的核心问题是:直接用新交易金额再次扣除余额,没有还原之前扣除的旧金额,导致余额计算逻辑错误。


修正方案

要解决这个问题,核心逻辑是先还原旧交易金额到余额,再扣除新交易金额,具体步骤如下:

  1. 保存编辑前的交易原始金额
  2. 从数据库获取用户最新的余额数据(避免使用本地缓存的过期数据)
  3. 将旧金额加回余额,恢复到交易修改前的余额状态
  4. 校验新金额是否超过当前可支配余额(加回旧金额后的余额)
  5. 扣除新金额并更新余额到数据库

修改后的代码

async Task UpdateTransaction()
{
    // 保存编辑前的原始交易金额
    var originalAmount = VwTransaction.AMOUNT;
    
    // 构建更新后的交易对象
    Transaction.ID = VwTransaction.ID;
    Transaction.CREATED_DATE = (DateTime)VwTransaction.CREATED_DATE;
    Transaction.DOCUMENT_NUM = VwTransaction.DOCUMENT_NUM;
    Transaction.UserID = VwTransaction.USERID;
    Transaction.PARTICULARS = VwTransaction.PARTICULARS;
    Transaction.AMOUNT = VwTransaction.AMOUNT;

    // 先更新交易记录
    var updated = await tranService.UpdateTransaction(Transaction);
    if(updated is not null)
    {
        await Task.Delay(1000);
        
        // 从数据库获取用户最新的余额记录,避免本地缓存过期
        var currentBalance = await balanceService.GetBalanceByUserId(VwTransaction.USERID);
        if(currentBalance == null)
        {
            Snackbar.Add("用户余额记录不存在", Severity.Error);
            return;
        }

        // 1. 还原旧交易金额到余额
        currentBalance.Balance += originalAmount;
        // 2. 校验新金额是否超过可支配余额
        if(Transaction.AMOUNT > currentBalance.Balance)
        {
            Snackbar.Add("用户余额不足", Severity.Error);
            // 可选:回滚已更新的交易记录,保证数据一致性
            return;
        }
        // 3. 扣除新交易金额
        currentBalance.Balance -= Transaction.AMOUNT;
        
        // 更新余额到数据库
        await balanceService.UpdateBalance(currentBalance);
        Snackbar.Add("交易更新成功", Severity.Success);
        return;
    }
    Snackbar.Add("更新失败", Severity.Error);
}

关键注意点

  • 使用最新余额数据:避免依赖本地缓存的Balance对象,防止其他并发操作导致余额数据过期
  • 余额校验:还原旧金额后再进行校验,确保用户有足够余额支付新的交易金额
  • 数据一致性(可选):如果你的服务层支持数据库事务,可以将交易更新和余额更新放在同一个事务中,避免出现交易更新成功但余额更新失败的情况

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:53:12