# Spring手动提交事务

@Service
public class SequenceServiceImpl implements SequenceService {

    @Autowired
    private SequenceMapper sequenceMapper;

    @Autowired
    RedissonClient redisson;

    @Autowired
    PlatformTransactionManager platformTransactionManager;


    /**
     * 通过名称获取代码
     * */
    @Override
    public String getSequenceCode(GenerationCodeEnum codeEnum) {
        RLock fairLock = redisson.getFairLock(RedisLockKeyConst.SEQUENCE_LOCK_KEY +"-"+ codeEnum.getValue());
        fairLock.expire(10000, TimeUnit.MILLISECONDS);
        fairLock.lock();

        // 事务定义
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        // 设置事务的传播行为
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        // 开启事务并获取事务状态
        TransactionStatus status = platformTransactionManager.getTransaction(def);
        try {
            SequenceVO sequenceVO = sequenceMapper.findSequenceCode(codeEnum.getValue());
            if (Objects.isNull(sequenceVO)) {
                throw new ApplicationRuntimeException(String.format("生成编号失败,请初始化:%s!", codeEnum.getValue()));
            }
            String sequenceNo;
            Long currentValue = sequenceVO.getCurrentValue() + sequenceVO.getIncrementVal();
            if (sequenceVO.getNeedSuffix().equals("1")) {
                sequenceNo = sequenceVO.getSeqPrefix() + currentValue + (int) ((Math.random() * 9 + 1) * 1000);
            } else {
                sequenceNo = sequenceVO.getSeqPrefix() + currentValue;
            }
            sequenceMapper.updateSequence(codeEnum.getValue());
            platformTransactionManager.commit(status);
            return sequenceNo;
        } catch (Exception e){
            platformTransactionManager.rollback(status);
            throw e;
        } finally {
            if(fairLock.isExists() && fairLock.isLocked()) {
                fairLock.unlock();
            }
        }

    }
}

修改于: 8/11/2022, 3:17:56 PM