送礼-钱包-扣钻-放开嵌套事务

This commit is contained in:
khalil
2025-01-11 01:55:55 +08:00
parent 7b8e610325
commit df8e4eea03
2 changed files with 35 additions and 1 deletions

View File

@@ -196,7 +196,8 @@ public class GiftSendService extends BaseService {
return giftSendConsumeGoldService.exchangeGoldToSend(sendUid, goldNum);
} else {
//账单等mq
return userPurseService.subDiamond(sendUid, goldNum.doubleValue(), objTypeEnum, UserPurse::getDiamonds);
//因为外层有事务
return userPurseService.subDiamondWithoutTx(sendUid, goldNum.doubleValue(), objTypeEnum, BusiStatus.PURSEMONEYNOTENOUGH, UserPurse::getDiamonds);
}
} else if (giftSource == Constant.GiftSource.BACKPACK) {

View File

@@ -147,6 +147,39 @@ public class UserPurseService extends ServiceImpl<UserPurseMapper,UserPurse> {
return SpringContextHolder.getBean(UserPurseService.class).subDiamond(uid, diamondNum, objTypeEnum, BusiStatus.PURSEMONEYNOTENOUGH, billConsumer);
}
//@Frozen
//@Transactional(rollbackFor = Exception.class, transactionManager = "mybatisplusTransactionManager")
public UserPurse subDiamondWithoutTx(Long uid, Double diamondNum, BillObjTypeEnum objTypeEnum, BusiStatus busiStatus, Consumer<UserPurse> billConsumer) {
if (diamondNum <= 0d) {
throw new ServiceException(BusiStatus.AMOUNT_PARAM_ERROR);
}
String desc = objTypeEnum.getDesc();
UserPurse after = withLock(uid, RedisKey.lock_user_diamond, userPurse-> {
double restDiamond = DoubleUtil.sub(userPurse.getDiamonds(), diamondNum);
if (restDiamond < 0d){
throw new ServiceException(busiStatus);
}
log.info("subDiamond 操作前,buss:{},userPurse:{}", desc, gson.toJson(userPurse));
int ret = baseMapper.updateMinusDiamonds(uid,diamondNum);
boolean result = SqlHelper.retBool(ret);
if(!result) {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
userPurse.setDiamonds(DoubleUtil.sub(userPurse.getDiamonds(), diamondNum));
log.info("subDiamond 操作后,buss:{},userPurse:{}", desc, gson.toJson(userPurse));
return userPurse;
});
if (null != billConsumer) {
billConsumer.accept(after);
} else {
billRecordService.insertGeneralBillRecord(uid, objTypeEnum, diamondNum, after);
}
return after;
}
@Frozen
@Transactional(rollbackFor = Exception.class, transactionManager = "mybatisplusTransactionManager")
public UserPurse subDiamond(Long uid, Double diamondNum, BillObjTypeEnum objTypeEnum, BusiStatus busiStatus, Consumer<UserPurse> billConsumer) {