关于异步减库存
来源:8-1 事务型消息(上)

syousyou
2019-06-05
老师好,您在视频里说“一旦发送消息失败,就没有机会回滚库存”,这句话我没能理解,下面的if不就是用来回滚的吗?
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
// 异步减库存 2019.06.05
boolean mqResult = itemService.asyncDecreaseStock(itemId, amount);
//if (!mqResult) {
// itemService.increaseStock(itemId, amount);
// throw new BusinessException(BusinessErrEnum.MQ_SEND_FAILED);
//}
}
});
写回答
1回答
-
因为mq发送失败可能有两种情况
发送其实没有失败,只是发送端没有收到mq已经收到发送消息的确认,这个时候如果我们不注释掉mq失败的代码,会去回补redis的库存,但是消息其实已经被消费端消费,把数据库扣掉了,这个时候就会产生redis和数据库不一致
发送真的失败了,但是在执行redis回滚之前程序出了问题,进程退出了,因此库存没机会加回去了
以上都是因为分布式的环境下没有统一的去做最终一致性的事务型方案,因此引入了后面的事务型消息机制
232019-09-08
相似问题