主要修改: 1. FundService.java - 所有账户更新都改用 LambdaUpdateWrapper 显式更新 - 充值审批通过:显式更新 balance, totalDeposit, updateTime - 提现审批通过:显式更新 frozen, totalWithdraw, updateTime - 提现审批驳回:显式更新 balance, frozen, updateTime - 取消订单:显式更新 balance, frozen, updateTime 2. 添加更新后立即验证机制 3. 添加详细的日志输出 4. 添加诊断文档 关键改进: - 使用 LambdaUpdateWrapper.set() 显式指定所有要更新的字段 - 更新后立即查询数据库验证 - 失败时抛出异常回滚事务 - 添加完整的日志追踪
2.6 KiB
2.6 KiB
充值审批流程诊断报告
🔍 问题描述
用户反馈: 审批通过后订单状态变为"已完成",但用户资金账户余额没有增加。
诊断发现
代码分析
- 账户余额更新: 使用 LambdaUpdateWrapper 显式更新 ✅
- 流水记录创建: 跻加了详细的日志输出 ✅
- AssetService.createFlow: 代码逻辑正确 ✅
可能的问题点
- 事务未提交: 虽然使用了 @Transactional, 但事务可能未正确提交
- 并发问题: 查询和更新之间可能有其他事务修改了数据
- 缓存问题: MyBatis 可能缓存了旧数据
- 日志未查看: 需要查看实际的 SQL 执行日志
🧪 诊断步骤
1. 查看审批日志
# 查找最近的审批日志
grep -A50 "充值审批成功\|账户更新结果" logs/spring.log | tail -20
# 查找 SQL UPDATE 语句
grep "UPDATE account_fund" logs/spring.log | tail -10
# 查找事务相关日志
grep -i "transaction\|commit\|rollback" logs/spring.log | tail -10
2. 直接查询数据库
-- 查询最近的充值订单
SELECT id, order_no, user_id, amount, status, approve_time
FROM order_fund
WHERE type = 1 AND status = 3
ORDER BY approve_time DESC
LIMIT 5;
-- 查询对应的用户资金账户
SELECT af.id, af.user_id, af.balance, af.total_deposit, af.update_time
FROM account_fund af
WHERE af.user_id IN (SELECT user_id FROM order_fund WHERE type = 1 AND status = 3 ORDER BY approve_time DESC LIMIT 5)
ORDER BY af.update_time DESC;
-- 查询资金流水记录
SELECT af.id, af.user_id, af.amount, af.balance_before, af.balance_after, af.flow_type, af.create_time
FROM account_flow af
WHERE af.flow_type = 1
ORDER BY af.create_time DESC
LIMIT 10;
3. 验证逻辑
- 订单状态 = 3 ✅
- 账户余额增加? ❌
- 流水记录存在? ❌
- 流水记录中的 balanceAfter = 实际余额?
🔧 可能的修复方案
方案 1: 添加事务同步验证
在 FundService.approve() 方法最后添加:
// 在方法最后验证最终结果
AccountFund finalFund = accountFundMapper.selectById(fund.getId());
System.out.println("[最终验证] 账户余额: " + finalFund.getBalance());
if (!finalFund.getBalance().equals(newBalance)) {
throw new RuntimeException("账户余额更新失败!");
}
方案 2: 使用数据库锁
// 在查询账户时加锁
SELECT * FROM account_fund WHERE id = ? FOR UPDATE
方案 3: 检查事务配置
确保 Spring 事务管理正确配置:
📋 下一步
- 启动服务
- 执行审批操作
- 查看日志输出
- 查询数据库验证
- 根据结果调整修复方案