参考九章的讲座。
悲观锁:用户先判断是否拿到锁,如果没有拿到,则排队等待。若可以拿到,则减库存,然后释放锁,这时排队等待的线程有一个可以得到锁。

SQL实现: 注意"for update"表示执行完step 1语句后,把product_id = xxxxx 锁住,其它线程则不能对product_id = xxxxx操作。

//step 1:
select * from stock where product_id = xxxxx for udpate
//step 2:
udpate stock set count = count - 1 where product_id = xxxxx and count > 0

缺点: 1) 会占用大量线程资源,因为一个线程更新不成功,其他线程全部等待。比如说Mysql的线程资源全部耗尽,从前端客户的角度看起来是一直在等待。2) 更新会很慢。
使用场景:在流量不大,对数据一致性要求又非常高的时候,可以用悲观锁。

乐观锁:我不锁,先更新。更新失败了再重新来过

注意这里更新是要结合版本号。如果结合版本号查询有库存,则扣库存, 否则说明版本号被更新。


SQL实现:
查version字段,如果相等,说明可以更新,同时把version+1,否则说明更新失败(因为其他线程更新过了)。

udpate stock set count = count - 1 and version = verison + 1 where product_id = xxxxx and count > 0 and version = xxxxx

一个更新失败的例子:
1. select version 1
2. do some logic. At this time, another thread change the verison to 2
3. update stock version param 1 //发现失败了,则更新version to 1,再重新来过。

使用场景:如果只要保证数据最终一致性,可以用乐观锁。
秒杀场景不适合乐观锁,因为verion字段会一直变! 后台会一直忙于更新,大量线程hold住。

个人总结:从上面可以看出, 因为MySql的并发量很低(单机1000),无论乐观锁和悲观锁好像都不适用。那怎么办呢?把库存表放在Redis(并发量单机10万)里面就好了。Redis 6.0之前只有一个线程可以访问(单线程模式),自动满足高并发模式。

秒杀系统中乐观锁(Optimistic Lock)和悲观锁(Pessimistic Lock)的对比相关推荐

  1. lock是悲观锁还是乐观锁_图文并茂的带你彻底理解悲观锁与乐观锁

    点击上方蓝色字体,选择"设置星标" 优质文章,第一时间送达 文章转自:Hollis 原创:安静的boy 这是一篇介绍悲观锁和乐观锁的入门文章.旨在让那些不了解悲观锁和乐观锁的小白们 ...

  2. 秒杀系统中如何动态生成下单随机URL

    秒杀系统中通常会避免用户之间访问下单页面的URL(避免使用爬虫来造成不公平).所有需要将URL动态化,即使秒杀系统的开发人员也无法在知晓在秒杀开始时的URL.解决办法是在获取秒杀URL的接口中,返回一 ...

  3. 多线程与高并发基础一(超发--多线程悲观锁,乐观锁、类数据库悲观锁乐观锁)

    PS:看完文章后对自己以前所做过的并发和锁机制有了深入原理的了解. 知其然和知其所以然! 遂以记之! 关键词: 线程,同步,单例,高并发,高访问,死锁 一.大规模并发带来的挑战 在过去的工作中,我曾经 ...

  4. mysql proxy 悲观锁_使用MySQL悲观锁解决电商扣库存并发问题

    昨天有人提出想看悲观锁,所以今天我们就说一说如何抗悲观锁解决并发问题: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态 ...

  5. Springboot秒杀系统(乐观锁+RateLimiter令牌+Redis缓存)

    本文主要是利用springboot,实现一个单机版秒杀demo,通过单机版实现,可以对基本并发秒杀的知识有一定的了解. 首先先提供秒杀业务实现类: /*** spring 注解加在实现类*/ @Ser ...

  6. 简单秒杀系统中的redis限时抢购

    为什么要限时? 上一篇文章介绍了如何在大数据量用户的请求下对请求数量做限制,也就是接口限流.在实际的秒杀中,除了要考虑接口限流外,还要考虑即使用户通过了令牌桶算法的限流,但是也可能在要秒杀商品的时候( ...

  7. Mysql之乐观锁悲观锁:乐观锁检查数据状态 悲观锁更新时锁定数据

    1.问题来源 就是一数据表的数据  在两个人同时修改的时候  会出现混乱 例子:如一个字段记录status=1 表示可以下单  货品只有1个的时候    a下单的同时b也下单 : a有修改status ...

  8. 什么是乐观锁,什么是悲观锁?

    在互联网公司面试中,很多小伙伴都被问到关于锁的理解.今天,我给小伙伴们来聊一聊我对锁的理解,不管我们互斥锁.自旋锁.重入锁.读写锁.行锁.表锁等等等等这些概念,我把他们都归纳为两种类型,乐观锁和悲观锁 ...

  9. 乐观锁和悲观锁_什么是悲观锁和乐观锁?

    思维导图 文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 悲观锁 悲观锁是平时开发中经常用到的一种锁,比如Reent ...

  10. 2021面试 Lock,synch,dcl双检查锁sy+volite,悲观锁,偏向,轻量锁,重量锁,升级12

    0.数据库悲观锁:for update: MySQL实现悲观锁_九色鹿-CSDN博客_mysql悲观锁怎么实现 1. ReentrantLock锁公平与非公平实现.重入原理:  ReentrantLo ...

最新文章

  1. 计算机鹅点云,CVPR 2020 | 用于点云中3D对象检测的图神经网络
  2. 记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案
  3. Rabbitmq如何保证消息顺序执行
  4. iOS开发UI篇—直接使用UITableView Controller
  5. Linux 系统应用编程——出错处理(errno)
  6. 读取properties文件的信息
  7. POST提交数据之---Content-Type的理解;
  8. window - 安装 tomcat
  9. 计算机宏应用实例,【电脑技巧】Office word宏命令巧妙应用一例
  10. L2-016 愿天下有情人都是失散多年的兄妹(25 分)
  11. 王家林 构建spark集群
  12. 你想要的虚幻UE游戏人物模型素材都在这里,细致又齐全
  13. 巴比特 | 元宇宙每日必读:股价暴跌,强敌环伺,扎克伯格将如何续写元宇宙故事?...
  14. 欧姆龙PLC分频电路
  15. Android用命令行查看手机架构
  16. NRF24L01P(nrf24l01+)从入门到使用
  17. 苹果开发者账号(个人、公司、企业)的区别
  18. [GO]并的爬取捧腹的段子
  19. 64位win7下,plsql连接64位数据库时提示initialization error,已解决
  20. macd的python代码同花顺_详解MACD高级技巧,懂得运用的人不多

热门文章

  1. Quick MTF,镜头图像质量测试应用程序
  2. html图片轮播代码 贴吧,JS实现简易图片轮播效果的方法
  3. Captcha Cracker (java)附带replace用法
  4. kubectl 命令详解(三十一):rollout history
  5. Spring Cloud Bus 使用说明
  6. js 获取每个月的第一天和最后一天日期
  7. 优秀的人都在读的10本好书!
  8. 分享基于HTTP长连接的Web端即时通讯技术
  9. 用SQL分析北京周边城市:天津以及保定房价
  10. 个人支付方案(免签约)-支付宝当面付