@Transactional(rollbackFor = Exception.class) 确保库存扣减后发送MQ消息
@Transactional(rollbackFor = Exception.class) 确保库存扣减后发送MQ消息
在使用 @Transactional 注解进行事务管理时,如果需要在事务提交后发送MQ消息,并确保其他服务消费到的是扣减后的库存数量,需要将发送MQ消息的代码移动到提交库存之后。
原始代码:
@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);
}
}
});
}
修改后的代码:
@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);
}
// 查询扣减后的库存数量
for (Long drugId : drugIdList) {
// 查询库存数量并进行相应处理
}
}
});
// 提交其他
// 返回结果
}
解释:
- 将发送MQ消息的代码移动到提交库存之后,确保在发送消息时,库存已经成功扣减。
- 使用
TransactionSynchronizationManager.registerSynchronization方法,在事务提交后执行发送消息操作。 - 在
afterCommit方法中,可以查询扣减后的库存数量,并进行相应处理。
总结:
通过将发送MQ消息的代码移动到提交库存之后,并使用 TransactionSynchronizationManager 进行事务同步,可以确保在其他服务消费消息时,获取到扣减后的库存数量。
原文地址: https://www.cveoy.top/t/topic/pgKD 著作权归作者所有。请勿转载和采集!