有懂秒杀的兄弟吗?为什么 mysql 这样会出现超卖的问题

2018-11-20 17:15:26 +08:00
 cyhulk
首先设定一个前提,为了防止超卖现象,所有减库存操作都需要进行一次减后检查,保证减完不能等于负数。(由于 MySQL 事务的特性,这种方法只能降低超卖的数量,但是不可能完全避免超卖)

update number set x=x-1 where (x -1 ) >= 0;
为什么这条语句会出现超卖
16462 次点击
所在节点    Java
84 条回复
he583899772
2018-11-21 18:06:22 +08:00
@cyhulk 都行吧,当初萌新也是摸索过河,只要反正利用 redis 原子性操作就行了,不过订单没付款,自动取消的时候还要反补 redis 活动库存吧
zerozerone
2018-11-21 18:31:35 +08:00
老哥找到答案记得帮忙艾特我一下,我也想知道
cyhulk
2018-11-21 18:46:13 +08:00
@zerozerone 我自己做过 1000 个并发,不会初心超卖,那个博客说的是错的
agostop
2018-11-22 13:34:10 +08:00
1、这语句肯定是全表锁,全表遍历
2、既然是全表加锁遍历,当然是不会出现超卖

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/509707

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX