编辑交易时如何正确扣除初始余额?.NET8 Blazor Server开发问题
解决Blazor Server中交易编辑时余额重复扣除的问题
我在.NET 8 Blazor Server开发的交易系统中,添加交易时余额扣除逻辑正常,但编辑交易时会出现重复扣除的问题:
- 用户初始余额5000,添加1000交易后余额4000
- 编辑该交易将金额改为1200,预期余额应为3800,但当前代码会计算成4000-1200=2800,相当于重复扣除了新金额
当前编辑代码的核心问题是:直接用新交易金额再次扣除余额,没有还原之前扣除的旧金额,导致余额计算逻辑错误。
修正方案
要解决这个问题,核心逻辑是先还原旧交易金额到余额,再扣除新交易金额,具体步骤如下:
- 保存编辑前的交易原始金额
- 从数据库获取用户最新的余额数据(避免使用本地缓存的过期数据)
- 将旧金额加回余额,恢复到交易修改前的余额状态
- 校验新金额是否超过当前可支配余额(加回旧金额后的余额)
- 扣除新金额并更新余额到数据库
修改后的代码
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
相关产品推荐
相关产品推荐

