Hibernate 乐观锁异常处理

最进在工作中遇到了hibernate 处理并发问题,总结了一下用到了递归处理循环递归尝试,请大家多多指教

/**
* 判断产品额度是否可用
* @return
*/
public String isAvailableProductLimit(ProductLimit ccsProductLimit,Date date,BigDecimal txnAmt){
try{
logger.info("额度判断====isAvailableProductLimit");
//子产品代码
String productCodeChildren = ccsProductLimit.getProductCodeChildren();
//产品额度
BigDecimal limitTxnAmt = ccsProductLimit.getLimitTxnAmt();
//服务开始时间
String serviceStartTime = ccsProductLimit.getServiceStartTime();
//服务结束时间
String serviceEndTime  = ccsProductLimit.getServiceEndTime();
//判断是否合法的交易时间
boolean txnBoolean = DateUtils.isInDate(Calendar.getInstance().getTime(), serviceStartTime,serviceEndTime);
logger.info("==是否在合法交易时间:{}===服务开始时间:{}===服务结束时间:{}",txnBoolean,serviceStartTime,serviceEndTime);
//合法
if(txnBoolean){
//获取产品使用额度
ProductLimitUsing ccsProductLimitUsing = ccsProductLimitService.checkCcsProductLimitUsingExits(ccsProductLimit,date);
//产品额度-使用额度
if(limitTxnAmt.compareTo(ccsProductLimitUsing.getTxnAmtUsing().add(txnAmt)) >=0){
ccsProductLimitService.updateCcsProductLimitUsing(ccsProductLimitUsing);
return Constants.TXN_MESSAGE_SUCCESS;
}else{
return Constants.TXN_MESSAGE_NO_LIMIT;
}
2.

}else{
//不合法
return Constants.TXN_MESSAGE_UNOPEN;
}


}catch(Exception e){
if(e instanceof HibernateOptimisticLockingFailureException || e instanceof  StaleObjectStateException || e instanceof TransactionSystemException){
//乐观锁重试
return isAvailableProductLimit( ccsProductLimit,date,txnAmt);
}else{
e.printStackTrace();
return  Constants.TXN_MESSAGE_ERROR;
}


}

}



 @Transactional(propagation = Propagation.REQUIRES_NEW)
    public CcsProductLimitUsing checkCcsProductLimitUsingExits(ProductLimit ccsProductLimit,Date date){
        logger.info("额度判断====checkCcsProductLimitUsingExits");
        QCcsProductLimitUsing qCcsProductLimitUsing = QCcsProductLimitUsing.ccsProductLimitUsing;
        JPAQuery query = new JPAQuery(em);
        ProductLimitUsing ccsProductLimitUsing = query.from(qCcsProductLimitUsing).where(qCcsProductLimitUsing.productCodeChildren.eq(ccsProductLimit.getProductCodeChildren()).and(qCcsProductLimitUsing.txnEffectiveTime.eq(date))).uniqueResult(qCcsProductLimitUsing);
        if(null == ccsProductLimitUsing){
            try{
                ccsProductLimitUsing = new CcsProductLimitUsing();
                ccsProductLimitUsing.setTxnEffectiveTime(date);
                ccsProductLimitUsing.setProductCodeChildren(ccsProductLimit.getProductCodeChildren());
                ccsProductLimitUsing.setTxnAmtUsing(BigDecimal.ZERO);
                ccsProductLimitUsing.setUpdatedTime(new Date());
                return  rCcsProductLimitUsing.saveAndFlush(ccsProductLimitUsing);
            }catch(Exception e){
                e.printStackTrace();
                //处理唯一性索引异常
                checkCcsProductLimitUsingExits(ccsProductLimit,date);
            }
        }
        logger.info("checkCcsProductLimitUsingExits===产品代码:{}===时间:{}==ccsProductLimit={}",ccsProductLimit.getProductCodeChildren(),date, JsonSerializeUtil.jsonSerializer(ccsProductLimitUsing));
        return ccsProductLimitUsing;
    }

猜你喜欢

转载自blog.csdn.net/zmlm88/article/details/79422778