@Transactional(rollbackFor = Exception.class) 提交订单后发送RocketMQ消息,查询库存数量问题
@Transactional(rollbackFor = Exception.class) TackAnOrderVo tackAnOrder(@RequestBody @Validated PlaceOrderVo vo){
//提交订单
//提交库存
/提交其它
// 发送消息到 MQ TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){ @Override public void afterCommit() { //发送mq更新es库存标志 for (Long drugId : drugIdList) { DrugChangeMessage drugChangeMessage = new DrugChangeMessage(); drugChangeMessage.setDrugId(drugId); drugChangeMessage.setStoreId(order.getStoreId()); drugChangeMessage.setChangeType(5); drugChangeMessage.setMerchantId(Long.parseLong(merchantId)); drugChangeMessage.setEnterpriseId(Long.parseLong(enterpriseId)); drugChangeMessage.setPlatformId(Long.parseLong(platformId)); drugProducer.sendDrugChangeMsg(drugChangeMessage); }
}
});
}
rocketmq消息在其它服务消费,查询库存还是扣减前的库存数量内容:在其他服务消费RocketMQ消息后,查询库存的数量是扣减前的库存数量。这是因为在提交订单的方法中,发送RocketMQ消息的代码被放在了事务提交后执行的回调函数中。事务提交后,数据库中的库存才会被扣减,但是RocketMQ消息已经发送出去了,所以在其他服务消费RocketMQ消息时,查询的是扣减前的库存数量。
原文地址: https://www.cveoy.top/t/topic/pgKw 著作权归作者所有。请勿转载和采集!