请稍等 ...
×

采纳答案成功!

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

increment是应该是原子操作吧

图片描述

老师您好,这里我不同意您说的increment实际是先查后扣。我记得increment本身是原子性的操作。
这里您出现库存多扣的原因应该是先扣库存,再判断count < 0 这两步不是原子性的,所以在高并发下才出现库存扣为负数。
这里只需要在 count <0 的时候把扣掉的库存再increment回去,然后再抛出异常。应该就可以解决库存超扣的问题。
以上仅是我的个人想法,有不对的地方还请老师指正。

正在回答 回答被采纳积分+3

1回答

InCowboy 2021-03-17 17:45:42

是的,这里口误了,我的意思就是在业务层面扣库存和库存的判断会出现并发情况,然后把它放到lua脚本就可以避免,你说的count<0在还回去如果是在业务层面的话应该还是有问题,没有解决高并发问题,你可以试试看哈

0 回复 有任何疑惑可以回复我~
  • 提问者 慕仔8930017 #1
    谢谢老师解答,我在count<0的时候再increment++。 jmeter用十万个线程抢100个库存,经过几次测试没有出现库存被扣为负数的情况。 
    因为我们公司生产环境有类似的写法,如果有问题的话在高并发情况下可能会有灾难性后果。所以我想不通这种方案的问题在哪里,希望老师指点
    回复 有任何疑惑可以回复我~ 2021-03-17 21:55:47
  • InCowboy 回复 提问者 慕仔8930017 #2
    你把你的代码贴出来,我看一下你怎么写的哈
    回复 有任何疑惑可以回复我~ 2021-03-17 22:58:35
  • 提问者 慕仔8930017 回复 InCowboy #3
    @GetMapping("test")
        public JsonData test() {
            Long stock = redisTemplate.opsForValue().decrement("stock");
            if (stock < 0) {
                redisTemplate.opsForValue().increment("stock");
                return JsonData.buildError("库存不足");
            }
            return JsonData.buildSuccess("扣库存成功");
        }
    redis里面stock是100,用十万个线程跑完后stock为0,没有出现负数
    回复 有任何疑惑可以回复我~ 2021-03-17 23:37:27
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信