秒杀项目,扣减库存。

  • 超卖是如何发生的?

如果多个线程,对数据库先查询,再扣减,就容易超卖。因为有可能每个线程查询,都有库存,然后同时扣减,就超卖了。

  • 所以,应该这么扣减 update stock set stock_count = stock_count-1 where item_id
    = xxx and stock_count>=1
  • 但是,这本质上是一个行锁,背后是串行执行的,所以rt(reaction time用户响应时间)就飙高,tps就上不去。
  • 很多人说,放在redis里面扣减库存。但是,有这个场景,扣减库存以后,要生成流水表,怎么保证他们的原子性?
  • 那么怎么提高并发度?1.降低锁的粒度 2.降低锁的持有时间

1.降低锁的粒度 分库分表的方式 需要做整个数据库层面的改动,代价太大。
2.降低锁的持有时间 将几个请求合并在一起,然后一起扣减库存,降低了io的次数,从而提高tps.
第二种方案可能遇到的问题:
a. 合并提交报错,有可能库存扣减成功,但是上游认为失败
b. 合并扣减总计超过剩余库存。 比如库存剩余2个,合并要扣减4个。尽量保证买的多的用户先扣减成功。


版权声明:本文为celebrateyang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/celebrateyang/article/details/125028436