关于异步减库存

来源: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回答

龙虾三少

2019-06-05

因为mq发送失败可能有两种情况

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

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

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


2
3
慕函数0223102
老师,如果这样解释的话,是不是在本章节前所做的所有因mq发送失败而回补redis库存的操作其实都是有问题的?而不仅仅是只在这一步有问题?
2019-09-08
共3条回复

聚焦Java性能优化 打造亿级流量秒杀系统(赠秒杀项目)

理解高流量电商网站性能构建思路 用高逼格技术解决性能提升问题

2176 学习 · 1009 问题

查看课程