金额数据修改避免脏读:使用mybatis的updateWrapper.setSql

需求:会员佣金到账,应该增加会员的可提成奖金、累计奖金,扣除对应的预计到账奖金

原先错误的写法会导致脏读:

 //更新师傅的可提现金额
            DistributionDO dist = this.distributionClient.getDistributorByMemberId(engineerId);
            if (oConvertUtils.isNotEmpty(dist)) {
                //提成佣金
                dist.setCanRebate(CurrencyUtil.add(dist.getCanRebate(), actualEngineerBonus));
                //累计佣金
                dist.setRebateTotal(CurrencyUtil.add(dist.getRebateTotal(), actualEngineerBonus));
                //扣除预计到账金额(冻结金额)
                //需要注意防止脏读,不可以直接把字段set,应该在sql里写
                double sub = CurrencyUtil.sub(dist.getCommissionFrozen(), parentBonus);
                if (sub > 0) {
                    dist.setCommissionFrozen(sub);
                } else {
                    dist.setCommissionFrozen(0.0);
                }

                this.distributionClient.edit(dist);

参考组长的写法:

组长说这样写法自带乐观锁

private void addEstimate(DistributionDO distributionDO, double estimateRebate) {
        UpdateWrapper<DistributionDO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql("commission_frozen = commission_frozen + " + estimateRebate);
        updateWrapper.eq("member_id", distributionDO.getMemberId());
        distributionMapper.update(null, updateWrapper);
    }

照虎画猫之后:

 /**
     * 佣金到账完成后的佣金变化方法
     *
     * @param memberId    归属会员ID
     * @param actualBonus 实际到账佣金
     * @param dueBonus    应到账奖金
     */
    @Override
    @Transactional(value = "memberTransactionManager", rollbackFor = Exception.class)
    public void bonusIntoAccount(Long memberId, Double actualBonus, Double dueBonus) {

        UpdateWrapper<DistributionDO> updateWrapper = new UpdateWrapper<>();
        //扣除预计到账金额(冻结金额)
        /* updateWrapper.setSql("commission_frozen = commission_frozen - " + dueBonus + ",can_rebate = commission_frozen + " + actualBonus + ",rebate_total = commission_frozen + " + actualBonus);*/
        updateWrapper.setSql("commission_frozen = commission_frozen - " + dueBonus);
        //提成佣金
        updateWrapper.setSql("can_rebate = can_rebate + " + actualBonus);
        //累计佣金
        updateWrapper.setSql("rebate_total = rebate_total + " + actualBonus);
        updateWrapper.eq("member_id", memberId);
        distributionMapper.update(null, updateWrapper);

    }

这里3个setSql是会拼接在一起。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解决"Request processing failed: org.mybatis.spring.MyBatisSystemException"错误的步骤如下: 1. 检查数据库连接:确保数据库服务器正在运行并且可以通过正确的连接字符串连接。验证数据库连接的用户名和密码是否正确。 2. 检查MyBatis配置文件:确保MyBatis配置文件中的数据库连接信息正确无误。检查是否已正确配置数据源和相关的数据访问对象(DAO)。 3. 检查MyBatis映射文件:检查MyBatis映射文件中SQL语句的语法和逻辑是否正确。确保映射文件中定义的SQL语句与数据库表结构和字段一致。 4. 检查实体类和映射文件的对应关系:确保实体类(POJO)和映射文件(XML)之间的对应关系正确无误。检查实体类的属性名与映射文件中的字段名是否一致。 5. 检查异常处理机制:在代码中添加适当的异常处理机制,以捕获并处理可能出现的异常情况。可以使用try-catch块或使用Spring框架提供的异常处理机制。 6. 检查日志输出:在代码中添加适当的日志输出,以便跟踪错误发生的位置和原因。使用日志框架(如Log4j、Slf4j等)记录详细的错误信息,以便于排查问题。 7. 检查依赖库版本:确保使用MyBatis和相关依赖库的版本兼容性良好。升级或降级依赖库版本,以解决可能存在的兼容性问题。 8. 检查其他可能原因:如果以上步骤都没有解决问题,可以考虑检查其他可能的原因,如数据库表是否存在、数据库连接池配置是否正确等。 请注意,以上步骤仅提供了一般性的解决方案,具体解决方法可能因实际情况而异。如果问题仍然存在,建议查看错误日志或调试代码,以获取更详细的错误信息和定位错误所在位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值