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