使用乐观锁解决超卖问题

news2024/11/25 22:24:28

目录

什么是超卖?

 乐观锁和悲观锁的定义

悲观锁:

乐观锁:

乐观锁的实现方式

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.coloradmin.cn/o/859228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

平替版Airtag

Airtag是什么? AirTag是苹果公司设计的一款定位神奇,它通过一款纽扣电池进行供电,即可实现长达1-2年的关键物品的定位、查找的功能。 按照苹果公司自己的话说—— 您“丢三落四这门绝技,要‍失‍传‍了”。 AirTag 可帮你轻松追…

USB(二):Type-C

一、引脚定义 Type-C口有 4对TX/RX差分线,2对USB D/D-,1对SBU,2个CC,4个VBUS和4个地线Type-C母座视图: Type-C公头视图: 二、关键名词 DFP(Downstream Facing Port): 下行端口&#xff0c…

【云原生】Pod的进阶

目录 一、资源限制二、重启策略三、健康检查 ,又称为探针(Probe)3.1示例1:exec方式3.2示例2:httpGet方式3.3示例3:tcpSocket方式3.4示例4:就绪检测3.5示例5:就绪检测2 四、启动、退出…

设置VsCode 将打开的多个文件分行(栏)排列,实现全部显示

目录 1. 前言 2. 设置VsCode 多文件分行(栏)排列显示 1. 前言 主流编程IDE几乎都有排列切换选择所要查看的文件功能,如下为Visual Studio 2022的该功能界面: 图 1 图 2 当在Visual Studio 2022打开很多文件时,可以按照图1、图2所示找到自…

价格监测与数据分析的关系

所谓的价格监测,其实可以理解为是低价数据的监测,当监测价格时,其他页面上的商品数据也会被同时采集监测,如标题、库存、销量、评价等内容,所以品牌在做电商价格监测时,其实也可以对数据进行分析。 力维网络…

【React学习】—jsx语法规则(三)

【React学习】—jsx语法规则(三) 一、jsx语法规则: 1、定义虚拟DOM,不要写引号, 2、标签中混入JS表达式要用{} 3、样式的类名指定不要用class,要用className 4、内联样式,要用style{{key:value}…

linux环形缓冲区kfifo实践2:配合等待队列使用

基础 struct __wait_queue_head {spinlock_t lock;struct list_head task_list; }; typedef struct __wait_queue_head wait_queue_head_t; 初始化等待队列:init_waitqueue_head 深挖init_waitqueue_head宏的定义可知,传递给它的参数q是一个wait_queu…

pytest 编写规范

一、pytest 编写规范 1、介绍 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1、简单灵活,容易上手,文档丰富;2、支持参数化,可以细粒度地控制要测试的测试用例;3、能够…

分享之python 协程

线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。 协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继…

Redux中reducer 中为什么每次都要返回新的state!!!

Redux中reducer 中为什么每次都要返回新的state!!! 最近在学习react相关的知识,学习redux的时候遇到看到一个面试题: 如果Redux没返回新的数据会怎样? 这就是要去纠结为什么编写reducer得时候为什么不允许直…

LT8711HE 是一款高性能的Type-C/DP1.2到HDMI2.0转换器

LT8711HE 1.描述 LT8711HE是一种高性能的Type-C/DP1.2到HDMI2.0转换器,设计用于连接USB Type-C源或DP1.2源到HDMI2.0接收器。LT8711HE集成了一个DP1.2兼容的接收器,和一个HDMI2.0兼容的发射机。此外,还包括两个CC控制器,用于CC通…

Linux Maven 安装与配置

目录 Maven 下载 解压缩下载的文件 移动Maven文件夹 配置环境变量 验证安装 注意 Maven 下载 官方地址 Maven – Download Apache Maven,下载完成后,解压到合适的位置即可; 解压缩下载的文件 解压缩下载的文件: 使用以下命…

Malloc动态内存分配

在C语言中我们会使用malloc来动态地分配内存,这样做的一个主要理由是有些数据结构的大小只有在运行时才能确定。例如,如果你正在编写一个程序,需要用户输入一些数据,但你不知道用户会输入多少数据,那么你就需要使用动态…

VGPU理解与实践包含虚拟机显卡直通,k8s安装,GPU-manager使用与实践测试

提示:文章分为三部分:物理GPU绑定虚拟机、k8s安装、gpu-manager虚拟化实现与测试 文章目录 前言一、什么是VGPU?二、此文件会拆分成三部分:1.物理机显卡直通虚拟机2.安装K8S3.安装GPU-manager、测试全流程 总结 前言 用户角度GPU…

【Linux】HTTPS协议——应用层

1 HTTPS是什么? HTTPS也是⼀个应⽤层协议.是在 HTTP 协议的基础上引⼊了⼀个加密层. HTTP 协议内容都是按照⽂本的⽅式明⽂传输的. 这就导致在传输过程中出现⼀些被篡改的情况. HTTP VS HTTPS 早期很多公司刚起步的时候,使用的应用层协议都是HTTP&am…

7.7 通俗易懂详解稠密连接网络DenseNet 手撕稠密连接网络DenseNet

一.思想 与ResNet的区别 DenseNet这样拼接有什么好处?DenseNet优点 对于每一层,使用前面所有层的特征映射作为输入,并且其自身的特征映射作为所有后续层的输入。 DenseNet的优点: 缓解了消失梯度问题,加强了特征传播&#xff0c…

在java集合HashMap中如何替换某一个键值

replace() 方法替换 hashMap 中是指定的 key 对应的 value。 replace() 方法的语法为: hashmap.replace(K key, V newValue) 或 hashmap.replace(K key, V oldValue, V newValue)示例代码如下(把hashmap集合中的值为USA 的记录替换 成“US”&#xff0…

2023牛客暑期多校训练营7(C/I/M)

目录 C.Beautiful Sequence I.We Love Strings M.Writing Books C.Beautiful Sequence 思路:显然若得到了a[1],则整个序列a我们都知道了。所以我们要求出第k大的a[1],这个可以利用序列a为不递减序列的性质来得出。 首先,由题…

Unity开发笔记:将Texture2D裁剪出指定圆角用来输出png等图片

学习记录整理,自用,也希望能帮助到有相同需求的人。 圆角原理见大佬的博客: 圆角原理 简单来说就是将图片分成四个区域,找出拐角处的拐子的设置为透明 ![](https://img-blog.csdnimg.cn/a788825545614816895a9cca42ddc4a9.png 如…

Feign实现远程调用

文章目录 Feign引入依赖添加注解编写Feign的客户端测试自定义配置配置文件方式Java代码方式 Feign使用优化引入依赖配置连接池 总结 Feign Feign是一个基于Java的声明式Web服务客户端,由Netflix开发。它简化了使用RESTful API进行远程服务调用的过程,并…