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

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

update number set x=x-1 where (x -1 ) >= 0;
为什么这条语句会出现超卖
15586 次点击
所在节点    Java
84 条回复
mayday526
2018-11-20 20:02:27 +08:00
@insert000 不可能,update 语句不是造成行级锁就是表锁,并发情况下也不可能是负数
qsbaq
2018-11-20 20:02:43 +08:00
高并发的话建议 redis 或者 memcached,频繁更新数据库会增加负载。
https://www.jiloc.com/44364.html
insert000
2018-11-20 20:06:18 +08:00
@mayday526 我说的是 x 设置成非负,没说会成负数,x>0 就造成能行锁了。是可以的
insert000
2018-11-20 20:09:43 +08:00
用 redis SETNX 当锁拦一道,抢到锁的再操作数据库就好了
tuntunxiong
2018-11-20 20:22:20 +08:00
redis list, rpush rpop
linbiaye
2018-11-20 22:11:45 +08:00
这个写法,事务级别为 RR, RC, Serialize 都不应该会出现问题才是,是不是没检查返回值?
oovveeaarr
2018-11-20 22:23:17 +08:00
的确比较奇怪,我也差不多是这种写法不应该会负数的
alcarl
2018-11-20 22:40:33 +08:00
这跟隔离级别没关系吧又不是 select,update 要先锁记录的,有别的事务锁不了就等着了,因此这条不会出现超卖,但现实中一般不会这么就一个条件就更新,一般 where 里还有别的条件需要先查查 sql 的别的地方
ppyybb
2018-11-20 22:55:53 +08:00
不讨论秒杀
就这个语句,不可能超卖:
默认是 rr 的,即便是 rc 级别,update 也会加行锁,不存在超卖。

我怀疑你看的教程的正确性
alex321
2018-11-20 23:03:21 +08:00
redis list len
37rangers
2018-11-20 23:40:29 +08:00
你给它放到 redis list 里,先到先得每次只能出 list 一个 ,相对会好很多
jimchen9999
2018-11-21 00:00:55 +08:00
直接 redis pop 啊 要什么数据库
cubecube
2018-11-21 00:37:39 +08:00
@ppyybb 我觉得你说得对,帖子里面扯队列,redis 也是够了。就事论事,这个 mysql 语句是基本的 mysql 锁机制。行级别都保证不了一致性的话,mysql 死去算了。楼主其实没说清楚,最后是应用层超卖,还是这个 mysql 控制库存 x 小于 0 了?
loqixh
2018-11-21 00:57:11 +08:00
没有读 update 影响行数判断是否成功吧?
myhot21
2018-11-21 08:19:22 +08:00
并发下,这种 sql 是完全避免不了超卖,加事务也只是降低出现概率,最好的避免方式是改用队列。
polymerdg
2018-11-21 08:19:50 +08:00
上 redis 很難嘛?
ljzxloaf
2018-11-21 08:30:35 +08:00
你这是表锁啊,应该不会超卖,但是性能很差
wmhack
2018-11-21 09:00:17 +08:00
在外层代码里做 x-1 试试
ccl945
2018-11-21 09:05:52 +08:00
超卖放 redis,就 mysql 这尿性,没崩就要庆幸了
irgil
2018-11-21 09:18:42 +08:00
有人能分析一下为何会超卖吗?

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

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

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

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

© 2021 V2EX