当前位置: 首页 > news >正文

Java超卖问题

超卖问题是指并发环境下 对于一些库存操作,减少的库存比实际库存多的问题

解决方法

一.数据库排它锁

这是最简单的,也是性能最差的,先查询 查询的时候加排它锁,然后更新数据 库存--;

这样就天然的解决了超卖问题,但是显而易见的 这样有很多缺点

1.性能太差,几乎是牺牲了并发性能

2.容易造成死锁

3.若是库存设计多个服务,无法跨库加锁

只适用于单机或需要保持强一致的场所

二、数据库乐观锁(CAS)

先查询

再用cas的方式更新数据(update  where id=? and version=?")

这样不用加互斥锁 性能会好一些

但是需要重试机制,比较消耗cpu,而且若是并发量高 会造成大量重试

三、Redis+lua脚本

操作缓存,而不直接操作数据库

本来在高并发场景下,库存信息就要放在redis中 不可能放到数据库 每次都从数据库查

用lua脚本

第一步 

查询库存余量 若为0则放弃

第二步

将库存容量-1 放回redis中

那怎么更新mysql呢?

一般通过消息队列异步地更新:一定要添加重试策略(要实现幂等性)避免更新失败,若就是失败了则要持久化这一次任务,服务上线时插队执行任务

需要容忍数据的最终一致性!

四、分布式锁

解决分布式集群下的超卖问题  用Redission 

扣库存前加锁 保证只有一个线程能拿到锁

其他

其他的方法还有令牌桶这样的限流思路,就是假设库存为10000,只发10000个令牌,这样就不会超卖了(但是会不会少卖呢?)

http://www.dtcms.com/a/362031.html

相关文章:

  • MySQL安装与使用指南
  • 【读论文】量子关联增强双梳光谱技术
  • 力扣404 代码随想录Day15 第三题
  • 故障排查指南:理解与解决 “No route to host“ 错误
  • NOSQL——Redis
  • MySQL基础知识保姆级教程(四)视图与约束
  • 浅谈中断控制器:从 IRQ 到 IRR、IMR、In-Service Register
  • 软考-操作系统-错题收集(3)文件系统的索引节点结构
  • 【前端】《手把手带你入门前端》前端的一整套从开发到打包流程, 这篇文章都会教会你;什么是vue,Ajax,Nginx,前端三大件?
  • ComPE for win 纯净的PE系统
  • 软考中级数据库系统工程师学习专篇(67、数据库恢复)
  • Spring Security 深度学习(四): 会话管理与CSRF防护
  • 2025 数字化转型期,值得关注的 10 项高价值证书解析
  • Linux笔记---计算机网络概述
  • 视频动作识别模型-C3D
  • 线程池项目代码细节5(解决linux死锁问题)
  • 关系型数据库——GaussDB的简单学习
  • 《投资-43》- 自然=》生物=》人类社会=》商业=》金融=》股市=》投资的共同逻辑:生存竞争与进化论
  • 前端实现查询数据【导出】功能
  • 自制扫地机器人(二) Arduino 机器人避障设计——东方仙盟
  • A股大盘数据-20250901 分析
  • 设计模式:代理模式(Proxy Pattern)
  • HOW - 前端团队组长提升(沟通篇)
  • kubectl-etcd
  • RSA的CTF题目环境和做题复现第1集
  • nacos微服务介绍及环境搭建
  • linux 函数 kthread_should_stop
  • 「Unity3D」RectTransform的AnchorMin与Max直接定位到Rect四角,使得Left-Top-Right-Bottom都为0
  • 【Spark Core】(三)RDD的持久化
  • MT-Workflow: Odoo 可视化工作流引擎