请稍等 ...
×

采纳答案成功!

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

事务型消息异步扣减库存问题

Mq.TransactionListener().excuteLocalTransaction()方法里面,执行OrderService.createOrder扣减库存操作——先从redis里面扣,然后订单入库,销量+1。

//MqProducer.TransactionListener().executeLocalTransaction()
try {
    orderService.createOrder(userId, itemId, promoId, amount, stockLogId);
} catch (BizException e) {
    e.printStackTrace();
    StockLogDO stockLogDO = stockLogDOMapper.selectByPrimaryKey(stockLogId);
    stockLogDO.setStatus(3);
    stockLogDOMapper.updateByPrimaryKeySelective(stockLogDO);
    return LocalTransactionState.ROLLBACK_MESSAGE;
}
return LocalTransactionState.COMMIT_MESSAGE;

问题一@Transactional的作用:
createOrder方法加了@Transactional注解,方法只要出现了异常,是整个方法相当于没执行(Redis库存未被扣)。还是只是回滚订单表和商品表呢(Redis库存已被扣)。。。
问题二:如果只是回滚表,那么catch里面,出现异常,会回滚这条消息,也就是不去数据库里面扣减库存。但此时redis里面的库存是不是成了脏数据呢?所以在catch里面需不需要执行ItemService.increaseStock,把redis里的库存加回去呢。。

正在回答

1回答

事务注解只控制数据库 不控制redis 如果异常了redis多减了一次 引发少卖 但不会超卖

1 回复 有任何疑惑可以回复我~
  • 提问者 MaJesTySA #1
    那在catch里面加回去是不是也可以呢。。
    回复 有任何疑惑可以回复我~ 2019-09-10 23:15:55
  • 龙虾三少 回复 提问者 MaJesTySA #2
    加有可能加失败
    回复 有任何疑惑可以回复我~ 2019-09-10 23:16:30
  • 龙虾三少 回复 提问者 MaJesTySA #3
    而且有可能在redis操作扣前就抛了异常 这样catch内反而多家了 引起超卖
    回复 有任何疑惑可以回复我~ 2019-09-10 23:19:13
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信