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

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

龙虾三少

2019-09-10

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

1
4
MaJesTySA
非常感谢!
2019-09-10
共4条回复

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

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

2174 学习 · 1009 问题

查看课程