关于高并发第二种解决方案的疑问
来源: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 =
00
相似问题