高并发场景下扣库存的方案

比如商品 goods_id = 1 的商品库存有10件。100个用户同时购买,正常情况下只有10个用户能买到,其它用户提示库存不足。

方案一:

set autocommit = 0; begin; select sku from goods_sku where goods_id = 1; if(sku > 0){ update goods_sku set sku = sku - 1 where goods_id = 1; }else{ throw NoEnoughGoodsException(); } commit;
这种方案无法防止超卖。比如库存还有1,两个线程同时查到库存都为1后,做更新操作,这时库存就为-1了。

方案二

set autocommit = 0; begin; select sku from goods_sku where goods_id = 1 for update; if(sku > 0){ update goods_sku set sku = sku - 1 where goods_id = 1; }else{ throw NoEnoughGoodsException(); } commit;
这种方案防止了超卖,但是每次 select 都加了排他锁,阻塞其它线程读。

方案三

set autocommit = 0; begin; int affected = update goods_sku set sku = sku - 1 where goods_id = 1 and sku > 0; if( affected != 1){ throw NoEnoughGoodsException(); } commit;
这种方案解决了上面的问题,但是对数据库的压力还是很大。

方案四

使用Redis等NoSQL数据库。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万...
    威武霸气你六哥阅读 505评论 0 0
  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 5,607评论 1 14
  • 一、数据库操作: 1.1 创建数据库: create database student; 1.2 删除数据库: ...
    __71db阅读 851评论 0 0
  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目录结构 (2)MySQL配置向导文件(安装后配置...
    凛0_0阅读 1,000评论 1 0
  • 数据库基础知识 数据库客户端MySQL作为数据库服务器来运行,任何满足mysql通信规范的软件都可以作为客户端来连...
    littlexjing阅读 1,133评论 0 2

友情链接更多精彩内容