金额数据修改避免脏读:使用mybatis的updateWrapper.setSql
金额数据修改避免脏读:使用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是会拼接在一起。
更多推荐
已为社区贡献1条内容
所有评论(0)