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