目录

  • 1.场景
  • 2. 方法
  • 3.总结

1.场景

假设现在库存只有一个商品了,多线程下如何保证最后库存是0而不是负数

2. 方法

  • MySQL中的排他锁
update goods set num = num - 1 WHERE id = 1001 and num > 0

排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
就是类似于我在执行update操作的时候,这一行是一个事务(默认加了排他锁)。这一行不能被任何其他线程修改和读写

  • 采用了版本号的方式
select version from goods WHERE id= 1001;
update goods set num = num - 1, version = version + 1 WHERE id= 1001 AND version = @version(上面查到的version);
  1. 这种方式采用了版本号的方式,其实也就是CAS的原理
  2. 假设此时version = 100, num = 1;100个线程进入到了这里,同时他们select出来版本号都是version = 100。 然后直接update的时候,只有其中一个先update了,同时更新了版本号。那么其他99个在更新的时候,会发觉version并不等于上次select的version,就说明version被其他线程修改过了。那么我就放弃这次update
  • 利用redis

利用redis的单线程预减库存。比如商品有100件。那么我在redis存储一个k,v。例如 <gs1001, 100>
每一个用户线程进来,key值就减1,等减到0的时候,全部拒绝剩下的请求。
那么也就是只有100个线程会进入到后续操作。所以一定不会出现超卖的现象

3.总结

  1. 第二种方式而且还应该在执行该sql语句前增加一个num数目是否大于0的业务逻辑判断,而且该方式还是会加排它锁的。
  2. 实际上,第一种方法和第二种两种方式解决超卖的方式也有细微的一点区别
  1. 考虑两个线程,当库存数量为2时。
  2. 如果是第一种方式,那么两个线程都能成功执行。
  3. 如果为第二种方式,如果在第一个线程提交事务之前,第二个线程也执行了相同的sql拿到了version值(也就是线程1和线程2拿到了相同的version值),那么这两个线程之间将只有一个线程能够让库存数目减一成功执行。最终库存数目不为0,而为1

秒杀系统之超买问题详解相关推荐

  1. 教你从0到1搭建秒杀系统-防超卖

    各位读者好,最近笔者学了很多东西,其实都想跟大家进行分享,奈何需要将所学习的知识整理出来需要耗费大量的时间,包括总结,或各种图形以及写代码示例,所以可能更新的速度会比较慢.但大家放心,只要有时间我就会 ...

  2. Cache超清晰逻辑详解----不一致性(待更)

    文章目录 Cache超清晰逻辑详解 造成Cache与主存内容不一致的原因主要有两个: cache更新协议中的算法 解决Cache不命中的情况: 在多机系统中解决不一致性: 1.共享cache法 2. ...

  3. Virtual PC 2007下虚拟机与本机双XP系统实现互联与上网详解

    Virtual PC 2007下虚拟机与本机双XP系统实现互联与上网详解 1.在虚拟机安装windowsXP系统 2.为了不影响用来上网的原网卡,所以我们选择在主机上装一个虚拟网卡来与虚拟机进行通信, ...

  4. sshd系统自带启动脚本详解

    SSH 为 Secure Shell 的缩写.sshd服务是linux系统中最经常使用的服务之一.由于其规避了明文传送口令.内容本文及中间人***的安全隐患,因此经常作为远程管理系统的首选方案.虽然各 ...

  5. 【Linux系统编程】vfork() 函数详解

    00. 目录 文章目录 00. 目录 01. vfork函数 02. fork和vfork区别 03. 父子进程地址空间 04. 附录 01. vfork函数 函数分析 #include <sy ...

  6. 【Linux系统编程】fork()函数详解

    00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...

  7. apache启服务命令_Linux系统重启apache服务命令详解

    Linux系统中apache是重要的一个服务,掌握基本操作尤其重要.下面由学习啦小编为大家整理了Linux系统重启apache服务命令详解,希望对大家有帮助! Linux系统重启apache服务命令详 ...

  8. Linux(centos)系统各个目录的作用详解

    转自:Linux(centos)系统各个目录的作用详解 现在公司的服务器使用CentOS系统,在网上找到了这篇介绍linux各个目录的文章,觉得十分不错,所以拿来存个档. 整理之后如下: 文件系统的类 ...

  9. linux系统里route -n不起作用,Linux系统中traceroute命令使用详解

    Linux系统中traceroute命令可以追踪到网络数据包的路由途径.下面由学习啦小编为大家整理了linux系统中traceroute命令使用详解,希望对大家有帮助! Linux系统中tracero ...

最新文章

  1. SPSS数据记录的选择(Select Cases)
  2. 关于redis连接池
  3. 2011年ESRI北京站IDL视频教程(全)
  4. 怎么分辨是不是外包工司_花2万做外装农村自建房秒变别墅,农村工头:这还让人怎么混?...
  5. Docker学习总结(41)——Docker Compose 的两种安装方式总结
  6. [Error] iostream.h: No such file or directory的解决办法
  7. YAML书写规则与数据结构
  8. hashchange
  9. python炒股日记_Python日记
  10. 加密与解密 调试篇(一)
  11. 任务调度之Oozie详解
  12. STM32F1下载程序方法
  13. 怎么使用水经注万能地图下载器制作百度个性化道路地图
  14. cc攻击的原理和处理方式
  15. 2015年8月18日工作日志--------赵鑫
  16. 既生左,何生曾——曾国藩与左宗棠一生恩怨考
  17. 【MySQL】DML,DQL
  18. 1.12 DICOM彩色图像
  19. 基于JSP的汽车租赁管理系统的设计与实现
  20. echarts3在Y轴上做基准线

热门文章

  1. 妙春浆掀起养生革命热潮
  2. html第四章课后作业,物理化学答案——第四章化学平衡习题解答.doc
  3. “智慧监狱” 来了,你准备好了吗?
  4. 011 - JDK自带的性能监控工具
  5. Android grade语法,多渠道打包
  6. 2048小游戏加入主菜单
  7. 生发固发止脱发、穴位按摩有奇效
  8. GTA5无法访问R星服务器问题
  9. 小程序页面跳转传递对象
  10. Java 1090 危险品装箱