资损防控-幂等代码

1、幂等

//幂等
public TradeDO isIdempotent(TradeDO tradeDO) {  
    try {
        tradeDO.setStatus("INIT");
        //进行数据库insert,通过唯一键判断是否业务幂等
        tradeManager.add(tradeDO);
        return tradeDO;
    } catch (DuplicateKeyException e) {
        //添加失败,代表已经发起过同样的请求
        //用幂等流水号查询原单据,这里不能锁查,原单据可能正在处理
        TradeDO origTradeDO = tradeManager.queryByInstId(tradeDO);
        if(null == origTradeDO){
            //有可能是其他唯一索引导致的唯一键异常
            throw new Exception(XXXX);
        }
        //日志打印
        LogUtil.info(origTradeDO);
        //校验原单和入参关键信息是否一致,如金额,账户等等

        //判断状态
        if("SUCCESS".equals(origTradeDO.getStatus()) || "FAIL".equals(origTradeDO.getStatus())){
        //已到终态直接返回结果
        return origTradeDO;
    }
    //非终态,继续业务处理
    doing(tradeDO);
    return tradeDO;
}

2、状态流转

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public doing(TradeDO tradeDO){

    //1.一锁
    TradeDO origTradeDO = tradeManager.queryByIdForLock(TradeDO tradeDO);

    //2.二判
    if("SUCCESS".equals(origTradeDO.getStatus()) || "FAIL".equals(origTradeDO.getStatus()))           
    {
        //已到终态直接返回结果
        return result;
    }

    //业务执行
    //execute();

    //3.三更新
    tradeDO.setStatus("SUCCESS"/"FAIL");
    tradeManager.update(TradeDO tradeDO);
}

你可能感兴趣的:(java)