业务场景:
在交易单创建service服务中,要求交易单创建失败,会保存创建失败日志,发现始终无法保存创建失败日志。
伪代码:
@Service("xdtTradeOperatorService")
@Transactional(rollbackFor = Exception.class)
public class XdtTradeOperatorServiceImpl implements XdtTradeOperatorService {
@Override
public TradeVo createTrade(TradeVo tradeVo) throws XdtRemoteBusinessException {
try{
//初始化
init(tradeVo);
//保存交易单
saveTrade(tradeVo);
}catch(Exception e)
//保存交易单失败日志
xdtTradeFailLogService.save(tradeFailLogVo);
throw e;
}
}
分析原因:
创建交易单服务设置了事务异常回滚@Transactional(rollbackFor = Exception.class),当前使用默认事务传播行为Propagation.REQUIRED,所以当前保存交易单与保存失败日志在同一个事务中,因此当抛出异常后也无法保存失败日志。
解决方案:
设置保存失败日志服务的事务传播行为:Propagation.REQUIRES_NEW
伪代码实现:
@Service("xdtTradeFailLogService")
@Transactional(rollbackFor = Exception.class)
public class XdtTradeFailLogServiceImpl implements XdtTradeFailLogService {
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Long save(TradeFailLogVo vo) {
Preconditions.checkNotNull(vo, "vo不能为空");
TradeFailLogPo po = new TradeFailLogPo();
BeanUtils.copyProperties(vo, po);
return dao.save(po);
}
}