# 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();
}
}
}
}