在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里的库存加回去呢。。