开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段):下单异常问题演示】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/703/detail/12424
下单异常问题演示
1、模拟在确认订单时,整个流程扣减完库存,扣减完优惠卷,扣减完余额后,发生异常,订单没有确认成功,但是数据都被扣除,会导致数据的不一致,需要通过 mq 进行处理。
2、//模拟异常抛出
CastException.cast(ShopCode.SHOP_FAIL);
在正式测试之前,先检查数据,把优惠卷还原成未使用。
商品的库存是999个。
Trade_goods_number_log 中有下单成功的记录。
订单成功操作的记录。
余额是900。
余额操作的日志。
有异常后,查看执行结果,可以看到执行成功。
查看异常信息,订单检查通过,扣减库存成功,使用了优惠卷,扣减余额成功,抛出异常hopCode{success=false,code=0,message='
错误'}
订单没有确认成功。
可以看到订单里面的 order_status 为0。
优惠卷被使用。
库存减1。
用户余额减少。
余额有减少记录。
有库存操作记录。
没有处理数据的一致性。
privatevoidupdateorderstatus(Tradeorderorder){
order.setorderstatus(ShopCode.SHOPORDER_CONFIRM.
getcode());
order.setPaystatusShopCode.SHOPORDER_PAY_STATUS_NO_PAY.
getcode());
order.setconfirmTime(newDate());
intr=orderMapper.updateByPrimaryKey(order);
if(r<=0){
CastException.cast(ShopCode.SHOP_ORDER_CONFIRM_FAIL);
}
log.info("订单:["+order.getorderId()+"]状态修改成功");
}
3、如果出现异常后,在 catch 中发送异常,确认订单失败的消息,在库存服务,优惠卷服务,用户服务以及订单服务中是否去监听消息,进行数据的回退的处理,保证失败的补偿机制。