事务型消息异步扣减库存问题
来源:7-10 【勤于思考,夯实学习成果】阶段思考题

MaJesTySA
2019-09-10
在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多减了一次 引发少卖 但不会超卖
142019-09-10
相似问题
关于异步减库存
回答 1
不异步写入订单是不是还是有瓶颈
回答 1