首先 并发我是这样理解的:
2 个人同时下单, 库存只有 1, 那么肯定有一个人无法抢到。也就是说, 库存只会减 1, 订单也只会生成一条。
后来我用 Jmemter 模拟 1000 人同时操作, 发现订单确实只有一个, 而且库存也没有负数, 但是我并没有做什么锁啊或者队列这些一谈到并发就会涉及到的东西。
$a
是查询到的库存
$b = $a-1;
if($b>=0){
生成订单
修改库存
}
如果没有 if
判断, 确实会负。但是如果加了这个 if
判断就库存只减少 1, 订单只有一条
那么我的问题来了, 加个 if
判断就能解决并发? 还是说实际上真正要处理的是模拟测试后出现的错误率 (Jmemter, 模拟 1000 人, error:59.5%), 或者其他?
请各位大佬解答, 如果我的思路有错误, 也请毫不留情
你说的订单问题,其实是:高并发场景下,如何正确扣减库存的问题
if($b>=0)
这样的判断,在高并发的场景下并不使用,因为这样的业务逻辑判断并不是原子操作
,所以存在脏读
的可能。例如:
如何解决这个问题呢?
加锁;
队列:改并行为串行,依次扣减;
操作转换为原子操作;
不光是数据库操作,高并发场景下,还可能会面对什么问题呢:
单点问题(当然 非刚并发场景也会面临这个问题,但是高并发场景,此问题尤为突出)
最大连接数问题,eg.
web 服务器
数据库
...数据安全问题,eg.
脏读
重复操作