请稍等 ...
×

采纳答案成功!

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

@Transactional的问题

视频两分钟处介绍之前简单实现的异步扣减库存时,说createOrder中decreaseStock之外的其他方法执行失败,会产生少卖的现象。但是decreaseStock方法有@Transactional注解标注,若其他步骤失败,如生成订单号失败,decreaseStock方法不会回滚吗?redis中的库存不会因为事务回滚而再加上吗?

正在回答

1回答

事务回滚是数据库的事务回滚,和redis无关,如果redis扣减了那么外部的所有情况和redis都无关,事务回滚,redis也不会自己加回来

1 回复 有任何疑惑可以回复我~
  • 提问者 PiedLife #1
    那么意思是这种情况下,即使加了@Transactional注解。redis中扣减的,和mq中异步扣减的mysql中库存,都不会回滚再加上。
    回复 有任何疑惑可以回复我~ 2019-06-24 17:29:35
  • 龙虾三少 回复 提问者 PiedLife #2
    是的,包括实际项目中的设计,应该将所有除开数据库硬件异常,网络超时这种可重试成功的异常撇开后的一些异常(例如活动未开始或者已结束,商品已下架不存在这种)放在扣redis操作之前校验完毕,一旦redis扣减成功,业务意义上就是“抢到了”
    回复 有任何疑惑可以回复我~ 2019-06-24 17:31:25
  • 提问者 PiedLife 回复 龙虾三少 #3
    老师,还有一个问题,在第八章完结版代码中的两个地方:1. MqProducer的executeLocalTransaction方法中orderService.createOrder执行失败进而执行catch代码段,2.checkLocalTransaction方法中,执行return LocalTransactionState.ROLLBACK_MESSAGE之前。都意味着下单操作失败了,是不是把redis已经扣减的库存加上比较好。
    回复 有任何疑惑可以回复我~ 2019-06-24 18:33:13
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信