1
2kCS5c0b0ITXE5k2 2021-05-10 18:10:42 +08:00
会
|
2
sadfQED2 2021-05-10 18:27:19 +08:00 via Android
超卖跟你有没有符号没关系
|
3
MeteorCat 2021-05-10 18:51:14 +08:00 via Android
超卖是人性问题,不是技术问题
|
4
zhaoyuting 2021-05-10 19:42:40 +08:00
我就想问,什么是并发超卖问题?
|
6
brader OP @zhaoyuting 就是并发减库存的时候,出现负数库存
|
7
dettan 2021-05-10 21:14:02 +08:00
但你还是卖出去了,只是库存数不是负数罢了,还是卖出去了比预期多的数量
|
8
rekulas 2021-05-10 21:19:10 +08:00
我觉得超卖的主要问题不是卖超了,而是高并发下仍然保证能流畅且不出错的运行,你这个也是基于数据库锁来阻塞请求,跟人人都会用的基本的事务锁没有本质区别,解决不了高并发的问题
|
9
rekulas 2021-05-10 21:21:04 +08:00
对。。忽略了,如楼上所说,你这个还不如事务锁,因为不但阻塞了,还仍然存在超卖问题
|
11
yufpga 2021-05-10 21:22:33 +08:00
日常的并发操作下, 你说这这个是可以避免的。问题是如果是秒杀系统, 请求都不会直接打到 mysql.
|
12
zhaoyuting 2021-05-10 23:29:30 +08:00
@brader 我不知道你的需求和设计是什么样子的,还有出现问题的具体情况是什么。
所以我上面想问,什么是(你遇到的)并发超卖问题? 看看这个有用没? https://zhuanlan.zhihu.com/p/165401466 |
13
xuanbg 2021-05-10 23:52:51 +08:00
一般情况下,超卖只是个技术问题而已。对于销售来说,不过是把进货-销售-发货的顺序变成销售-进货-发货罢了,销售就是销售,哪来的超卖?卖的越多越好!
特殊情况下,少量的超卖也是可以接受的。譬如限量 100 件的 5 折优惠特价商品,卖出去 101 件也不是什么大事,卖了就卖了,至于要这么斤斤计较的嘛。 至于技术那种斤斤计较绝对不肯超卖的做派,销售表示完全不能理解。 |
15
xuanbg 2021-05-11 03:14:00 +08:00
@liprais 我已经说得很明白了吧?特殊情况下是需要控制的,但也不是要完全控制不能超,可以有限地超。对于前者,系统设计的代价很大,但对于后者,就几乎没有什么代价。
|
16
ferock 2021-05-11 07:10:59 +08:00 via iPhone
很多都是在纸上谈兵
|
17
RH 2021-05-11 07:19:02 +08:00 via iPhone
设置为无符号,假设库存字段为 stock,更新用 stock = stock - 1 应该不会超卖,mysql 会返回错误,处理错误提示给客户就可以了。
|
18
CRVV 2021-05-11 09:41:41 +08:00 1
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 里说的这个回答。 |
19
brader OP @zhaoyuting 基本上不考虑高并发问题,因为没有那么大用户量,只是单纯想要防止一些别有用心的人,保证数据的完整性就可以了。
|