package org.jeecg.modules.test.seata.account.service.impl;
|
|
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.jeecg.modules.test.seata.account.entity.SeataAccount;
|
import org.jeecg.modules.test.seata.account.mapper.SeataAccountMapper;
|
import org.jeecg.modules.test.seata.account.service.SeataAccountService;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Propagation;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.Assert;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
|
/**
|
* @Description: TODO
|
* @author: zyf
|
* @date: 2022/01/24
|
* @version: V1.0
|
*/
|
@Slf4j
|
@Service
|
public class SeataAccountServiceImpl implements SeataAccountService {
|
@Resource
|
private SeataAccountMapper accountMapper;
|
|
/**
|
* 事务传播特性设置为 REQUIRES_NEW 开启新的事务
|
*/
|
@DS("account")
|
@Override
|
@Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)
|
public void reduceBalance(Long userId, BigDecimal amount) {
|
log.info("=============ACCOUNT START=================");
|
SeataAccount account = accountMapper.selectById(userId);
|
Assert.notNull(account, "用户不存在");
|
BigDecimal balance = account.getBalance();
|
log.info("下单用户{}余额为 {},商品总价为{}", userId, balance, amount);
|
|
if (balance.compareTo(amount)==-1) {
|
log.warn("用户 {} 余额不足,当前余额:{}", userId, balance);
|
throw new RuntimeException("余额不足");
|
}
|
log.info("开始扣减用户 {} 余额", userId);
|
BigDecimal currentBalance = account.getBalance().subtract(amount);
|
account.setBalance(currentBalance);
|
accountMapper.updateById(account);
|
log.info("扣减用户 {} 余额成功,扣减后用户账户余额为{}", userId, currentBalance);
|
log.info("=============ACCOUNT END=================");
|
}
|
}
|