mysql 库存字段设置为无符号,还会出现并发超卖问题吗?

2021-05-10 18:10:12 +08:00
 brader
3006 次点击
所在节点    MySQL
21 条回复
2kCS5c0b0ITXE5k2
2021-05-10 18:10:42 +08:00
sadfQED2
2021-05-10 18:27:19 +08:00
超卖跟你有没有符号没关系
MeteorCat
2021-05-10 18:51:14 +08:00
超卖是人性问题,不是技术问题
zhaoyuting
2021-05-10 19:42:40 +08:00
我就想问,什么是并发超卖问题?
brader
2021-05-10 20:42:30 +08:00
@sadfQED2 我是这样想的,并发减库存,无符号不是减不到负数吗?那 SQL 语句不就报错了?这样不就避免了超卖了
brader
2021-05-10 20:42:48 +08:00
@zhaoyuting 就是并发减库存的时候,出现负数库存
dettan
2021-05-10 21:14:02 +08:00
但你还是卖出去了,只是库存数不是负数罢了,还是卖出去了比预期多的数量
rekulas
2021-05-10 21:19:10 +08:00
我觉得超卖的主要问题不是卖超了,而是高并发下仍然保证能流畅且不出错的运行,你这个也是基于数据库锁来阻塞请求,跟人人都会用的基本的事务锁没有本质区别,解决不了高并发的问题
rekulas
2021-05-10 21:21:04 +08:00
对。。忽略了,如楼上所说,你这个还不如事务锁,因为不但阻塞了,还仍然存在超卖问题
brader
2021-05-10 21:22:09 +08:00
@dettan 如果 sql 抛错的话,怎么会卖出去呢,事务都没有提交到啊
yufpga
2021-05-10 21:22:33 +08:00
日常的并发操作下, 你说这这个是可以避免的。问题是如果是秒杀系统, 请求都不会直接打到 mysql.
zhaoyuting
2021-05-10 23:29:30 +08:00
@brader 我不知道你的需求和设计是什么样子的,还有出现问题的具体情况是什么。
所以我上面想问,什么是(你遇到的)并发超卖问题?

看看这个有用没? https://zhuanlan.zhihu.com/p/165401466
xuanbg
2021-05-10 23:52:51 +08:00
一般情况下,超卖只是个技术问题而已。对于销售来说,不过是把进货-销售-发货的顺序变成销售-进货-发货罢了,销售就是销售,哪来的超卖?卖的越多越好!
特殊情况下,少量的超卖也是可以接受的。譬如限量 100 件的 5 折优惠特价商品,卖出去 101 件也不是什么大事,卖了就卖了,至于要这么斤斤计较的嘛。

至于技术那种斤斤计较绝对不肯超卖的做派,销售表示完全不能理解。
liprais
2021-05-11 00:04:20 +08:00
@xuanbg 你以为是 100 件多卖一件
实际上是 100 件卖出一万件
xuanbg
2021-05-11 03:14:00 +08:00
@liprais 我已经说得很明白了吧?特殊情况下是需要控制的,但也不是要完全控制不能超,可以有限地超。对于前者,系统设计的代价很大,但对于后者,就几乎没有什么代价。
ferock
2021-05-11 07:10:59 +08:00
很多都是在纸上谈兵
RH
2021-05-11 07:19:02 +08:00
设置为无符号,假设库存字段为 stock,更新用 stock = stock - 1 应该不会超卖,mysql 会返回错误,处理错误提示给客户就可以了。
CRVV
2021-05-11 09:41:41 +08:00
1. 楼主可以自己试一下
CREATE TABLE test (id, int, x int);
INSERT INTO test SELECT 1, 100000;
然后在多个线程上执行 UPDATE test SET x = x - 1 WHERE id = 1;
自己统计一下执行的次数和最后 x 的值。
这个才是所谓的超卖问题,和有没有减到 0 无关。

2. 可以通过修改事务的 isolation level 来解决这个问题,即使在多个线程上执行 x--,最后的结果也是对的。
这才是通过数据库来解决这个问题的方法。

3. 当然了,没有面试官会期望得到 2 里说的这个回答。
brader
2021-05-11 09:58:29 +08:00
@zhaoyuting 基本上不考虑高并发问题,因为没有那么大用户量,只是单纯想要防止一些别有用心的人,保证数据的完整性就可以了。
brader
2021-05-11 10:00:09 +08:00
@rekulas 平时正常业务不会有这么大访问量的,就是有时候,防止一些别有用心的人,来搞事。

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

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

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

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

© 2021 V2EX