关于高并发第二种解决方案的疑问

来源:13-2 通用电商下单服务+库存高并发控制逻辑实现(上)

慕斯0066757

2019-09-12

老师,您好!可能本人比较愚拙,对于您所提到的解决高并发超卖的第二种方案,利用update新增一个条件,我对代码做了尝试性的修改(for update已去除),如下:
图片描述
假设情况一:库存是5本,a用户、b用户分别各买3本,同时并发进来,会提醒b用户下单失败,从而解决b用户超卖问题
a用户:UPDATE book SET stock = 5 - 3 WHERE id = 1 AND stock = 5;
b用户:UPDATE book SET stock = 5 - 3 WHERE id = 1 AND stock = 5;
假设情况二:库存是5本,a用户、b用户分别各买2本,同时并发进来,此时依然会提醒b用户下单失败,但实际上b用户只买了2本,并未超卖,我在思考的过程中,在这里卡住了…
a用户:UPDATE book SET stock = 5 - 2 WHERE id = 1 AND stock = 5;
b用户:UPDATE book SET stock = 5 - 2 WHERE id = 1 AND stock = 5;
【当然,如果使用之前的for update,上述两种情况都可以避免】
请老师给与一些帮助,谢谢

写回答

1回答

编程浪子

2019-09-12

你好

你觉得这个例子是没有问题的。那是因为你在where条件中加入了一个限制词 stock = x

但是这个时候如果有人在后台把库存改成了5 ,不就出问题了。

所以乐观锁要的是一个单向发展的字段,一般我们会在数据库加入一个version字段,然后一直加 1,2,3,4,5,。。。。。

然后where 条件 加一个 version = 

0
0

微信服务号+Yii2.0构建商城系统全栈应用

传统PC后端与火热微信结合,打造一个摩登的商业电商系统

757 学习 · 744 问题

查看课程