用户秒杀失败 error:watched variable dchanged

用户秒杀失败 error:watched variable dchanged

# 具体遇到的问题
按照视频中讲解的秒杀逻辑,总是会出现报错,提示watched variable changed
# 报错信息的截图

# 相关课程内容截图

# 尝试过的解决思路和结果
想问下,按照这样的逻辑相当于每个进程只有一次秒杀机会,如果该进程在秒杀过程中试图修改被监视的值时恰好赶上了有其他进程完成了被监视值的修改,那么该进程就会报一个watched variable changed的错,然后进程就结束了,这样是不是不太对啊?
# 粘贴全部相关代码,切记添加代码注释(请勿截图)

在这里输入代码,可通过选择【代码语言】突出显示

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

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小轩 2020-12-15 11:45:33

同学,你好!
1. Watched variable changed:watch 执行之后, execute执行之前, 有其他客户端修改了 watch 中指定的key的值, 程序的事务就会抛出异常 redis.WatchError。
2. 视频中的逻辑是对的,课程中使用的是线程,当每一线程秒杀一次后,如试图修改被监视的值恰好赶上有其他线程完成被监视值的修改,则提示异常并报出watched variable changed异常,线程结束

  • 提问者 明月0423 #1
    但我们平时抢购的时候不会在明明有库存,只是因为别人在下单就失败吧,应该在抛出异常后立即进行下一次尝试抢购直到库存为0或者时间到,就是感觉buy内部应该是一个while true 的轮询,抛出watched value changed的错可以,但不能因为抛出这个错就结束抢购,应该立即重新再去尝试修改监视变量,直到库存为0,不然的话不就是凭运气,下单早的没抢到,下单晚的反而可以抢到了吗?换个场景假如商品库存有30件,然后开启30个秒杀线程,最后的结果竟然是商品卖不完,有若干个线程说秒杀失败?
    2020-12-15 15:57:06
  • 好帮手慕小轩 回复 提问者 明月0423 #2

    同学,你好!同学的理解是正确的, 使用watch是会出现还有剩余库存的情况,课程中只是实现了比较简单的秒杀,现实中的秒杀还会涉及到更多的功能点和相关知识

    2020-12-15 17:22:42
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师