peixue-dev/Archive/peidu-temp-files/docs/[一次性]钱包乐观锁问题修复-2026-01-25.md

3.2 KiB
Raw Blame History

🔧 钱包乐观锁问题修复

创建时间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

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() 需要修改

🚀 测试步骤

  1. 重启后端服务

    cd peidu/backend
    mvn clean compile
    mvn spring-boot:run
    
  2. 测试充值功能

    • 登录系统
    • 进入"我的钱包"
    • 点击"充值"
    • 选择金额(如 ¥200
    • 点击"确认充值"
    • 应该看到"充值成功"提示
    • 余额应该增加
  3. 验证数据库

    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
状态: 已修复,可以测试