请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于异步减库存

老师好,您在视频里说“一旦发送消息失败,就没有机会回滚库存”,这句话我没能理解,下面的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发送失败可能有两种情况

  1. 发送其实没有失败,只是发送端没有收到mq已经收到发送消息的确认,这个时候如果我们不注释掉mq失败的代码,会去回补redis的库存,但是消息其实已经被消费端消费,把数据库扣掉了,这个时候就会产生redis和数据库不一致

  2. 发送真的失败了,但是在执行redis回滚之前程序出了问题,进程退出了,因此库存没机会加回去了

以上都是因为分布式的环境下没有统一的去做最终一致性的事务型方案,因此引入了后面的事务型消息机制


2 回复 有任何疑惑可以回复我~
  • 提问者 syousyou #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-06-05 22:23:38
  • 老师,关于第二条,意思是说如果发送真的失败了,在执行redis回滚之前程序必定会因为出问题而导致进程退出吗?
    回复 有任何疑惑可以回复我~ 2019-06-15 22:04:27
  • 老师,如果这样解释的话,是不是在本章节前所做的所有因mq发送失败而回补redis库存的操作其实都是有问题的?而不仅仅是只在这一步有问题?
    回复 有任何疑惑可以回复我~ 2019-09-08 10:02:01
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信