使用乐观锁解决超卖问题

目录

什么是超卖?

 乐观锁和悲观锁的定义

悲观锁:

乐观锁:

乐观锁的实现方式

1.版本号

 2.CAS法


什么是超卖?

举个例子:订单系统中,用户在执行下单操作时,可能同一时间有无数个用户同时下单,当a用户的请求查询当前商品库存时,发现当前的商品剩余5件,在执行生成订单并减少库存时,线程切换了,此时b用户执行了查询操作,发现还是剩余5件,并进行了下单操作,这样就导致了这件商品被卖掉了两次

正常的情况如下:

 发生线程切换,产生异常的情况:

 乐观锁和悲观锁的定义

悲观锁:

认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行。例如SynchronizedLock都属于悲观锁

乐观锁:

认为线程安全问题不一定会发生,因此不加锁,只是在更新数据时去判断有没有其它线程对数据做了修改。

如果没有修改则认为是安全的,自己才更新数据。

如果已经被其它线程修改说明发生了安全问题,此时可以重试或异常

乐观锁的实现方式

1.版本号

给商品加上版本号字段,如果查询到就让其version=1,在修改执行的时候,先判断版本号是不是正确的,如果是让其版本号发生变化,并执行扣减,如果不是就说明当前商品已经卖出

       

 2.CAS法

CAS流程如下:

  1. 获取目标内存位置的当前值。
  2. 检查当前值是否与预期值相等。
  3. 如果相等,则将新值写入目标内存位置;否则,放弃写入操作,可能是重新读取当前值并重试整个CAS操作。

 比如当前的订单系统中,就可以使用查询到的库存作为预期值,修改的时候进行判定,如果是库存和第一次查询到的一样就执行,不一样就取消执行,这样就能够保证原子性

 具体实现只需要更改sql语句就可以做到

UPDATE users
SET stock=stock-1
WHERE id = 10 and stock = #{第一次查询到的库存};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/60610.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt应用开发(基础篇)——框架类 QFrame

一、前言 QFrame继承于QWidget,被QLCDNumber、QToolBox、QLabel、QListView等部件继承,是一个拥有矩形框架的基类。 QFrame可以直接创建成一个没有内容的的矩形框架,框架的样式由边框厚度(lineWidth)、框架形状(QFrame::Shape)和阴影样式(QFr…

linux自定义网络访问规则

1.更改防火墙默认区域为trusted firewall-cmd --set-default-zonetrusted 2.新建一个zone,将想要访问本机80端口的ip,如:192.168.3.99 ,添加的这个zone中,同时在这个zone中放行80端口。 firewall-cmd --permanent --ne…

Electron + Vue3 + Vite + TS 构建桌面应用

之前是使用React、Electron、TS和webpack来构建桌面应用的。虽然功能齐全,但是打包等等开发的体验不太理想,总感觉太慢了。作为一个开发者,我们总是希望,执行构建命令后,可以快速打包或者启动本地应用,且通过更少的配置,来完成开发体验。 现在的vite已经得到广泛的应用…

PHP流浪动物招领网站mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP流浪动物招领网站 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 下载链接 nullhttps://download.csdn.net/download/qq_41221322/88190168视频演示 …

挖洞小技巧

挖洞小技巧 1. Google语法1.1. 基础语法1.2. 操作符 2. 寻找漏洞2.1. SQL注入2.1.1. 不带公司2.1.2. 带公司2.1.3. 如何测试 2.2. 后台管理漏洞2.2.1. 查询单个网站2.2.2. 常见后台管理路径 2.3. 支付漏洞2.4. 文件上传漏洞2.5. 查找文件类型2.6. 敏感信息泄露 3. 刷分 1. Goog…

opencv37-形态学操作-开运算(先腐蚀后膨胀)cv2.morphologyEx()-参数 op 设置为“cv2.MORPH_OPEN”

腐蚀操作和膨胀操作是形态学运算的基础,将腐蚀和膨胀操作进行组合,就可以实现开运算、闭运算(关运算)、形态学梯度(MorphologicalGradient)运算、礼帽运算(顶帽运算)、黑帽运算、击中…

ArcGIS Pro暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用

GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…

Hadoop理论及实践-HDFS的Namenode及Datanode(参考Hadoop官网)

HDFS有什么特点,被设计做什么 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。有一下几个特点: HDFS是一个高度容错性的系统,具有高容错、高可靠性、高扩展性的特点,适合部…

复现原型链污染

目录 原型链污染是什么 例1 复现 例2 复现 原型链污染是什么 第一章中说到,foo.__proto__指向的是Foo类的prototype。那么,如果我们修改了foo.__proto__中的值,是不是就可以修改Foo类呢? 做个简单的实验: // fo…

Go语言进阶

个人笔记,大量摘自Go语言高级编程、Go|Dave Cheney等 更新 go get -u all 在非go目录运行go install golang.org/x/tools/goplslatest更新go tools:在go目录运行go get -u golang.org/x/tools/...,会更新bin目录下的应用; 运行…

APP专项测试知识点

APP的专项测试 测试要点: 功能测试、兼容性测试、安装、卸载、升级测试、交叉事件测试、PUSH测试、性能测试-使用solopi监控-仅适用于安卓手机(CPU、内存、流量测试、电量测试、流畅度测试、启动测试)、用户体验测试、稳定性测试 &#xf…