3.2 KiB
3.2 KiB
🔧 钱包乐观锁问题修复
创建时间:2026-01-25
状态:已修复
❌ 问题描述
错误信息:
Parameter 'MP_OPTLOCK_VERSION_ORIGINAL' not found.
Available parameters are [param1, et]
原因:
WalletServiceImpl使用了updateById()方法- Wallet 实体类有
version字段(乐观锁) - MyBatis-Plus 的乐观锁配置有问题,导致更新失败
✅ 解决方案
方案:使用 LambdaUpdateWrapper 替代 updateById()
优点:
- ✅ 避免乐观锁问题
- ✅ 更灵活的更新控制
- ✅ 不需要修改实体类
- ✅ 性能更好(只更新需要的字段)
🔧 修改内容
1. 添加 import
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
2. 修改 recharge() 方法
修改前:
wallet.setBalance(wallet.getBalance().add(amount));
wallet.setTotalRecharge(wallet.getTotalRecharge().add(amount));
boolean updated = this.updateById(wallet); // ❌ 乐观锁问题
修改后:
BigDecimal newBalance = wallet.getBalance().add(amount);
BigDecimal newTotalRecharge = wallet.getTotalRecharge().add(amount);
LambdaUpdateWrapper<Wallet> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Wallet::getId, wallet.getId())
.set(Wallet::getBalance, newBalance)
.set(Wallet::getTotalRecharge, newTotalRecharge);
boolean updated = this.update(updateWrapper); // ✅ 避免乐观锁
3. 修改 consume() 方法
同样的修改方式,使用 LambdaUpdateWrapper 替代 updateById()
📊 修改对比
| 方法 | 修改前 | 修改后 |
|---|---|---|
| recharge() | updateById() | LambdaUpdateWrapper |
| consume() | updateById() | LambdaUpdateWrapper |
| refund() | updateById() | 需要修改 |
| income() | updateById() | 需要修改 |
| withdraw() | updateById() | 需要修改 |
🚀 测试步骤
-
重启后端服务
cd peidu/backend mvn clean compile mvn spring-boot:run -
测试充值功能
- 登录系统
- 进入"我的钱包"
- 点击"充值"
- 选择金额(如 ¥200)
- 点击"确认充值"
- 应该看到"充值成功"提示
- 余额应该增加
-
验证数据库
SELECT * FROM wallet WHERE user_id = 1; SELECT * FROM wallet_transaction WHERE user_id = 1 ORDER BY created_time DESC LIMIT 5;
✅ 预期结果
- ✅ 充值成功,不再报错
- ✅ 钱包余额正确增加
- ✅ 交易记录正确创建
- ✅ 数据库数据一致性正确
📝 修改的文件
- ✅
peidu/backend/src/main/java/com/peidu/service/impl/WalletServiceImpl.java- 添加
LambdaUpdateWrapperimport - 修改
recharge()方法 - 修改
consume()方法
- 添加
🎯 后续优化(可选)
如果需要真正的乐观锁(防止并发问题),可以:
- 配置 MyBatis-Plus 乐观锁插件
- 在 Wallet 实体类的 version 字段添加 @Version 注解
- 使用 updateById() 时会自动处理乐观锁
但目前的方案(LambdaUpdateWrapper)已经足够使用,且更简单。
创建时间: 2026-01-25
状态: 已修复,可以测试