对于库存扣减问题的一些思考

最近在做公司WMS库存模块的需求,所以网上查阅了一些库存扣减相关的文章学习了一下。

方案

我们先来看看都有哪些扣减方案,各自优缺点给

方案一:查出库存,然后减去扣减数量,再更新回数据库

select stock_num from table where stock_id = 5;
new_stock_num = stock_num - $reduce;
update table set stock_num = new_stock_num where stock_id = 5;

这个方案大家应该都是直到是有问题的,所有操作不是原子性的。

方案二:改进方案一,更新时加上查询查询时的库存数量

select stock_num from table where stock_id = 5;
new_stock_num = stock_num - $reduce;
update table set stock_num = new_stock_num where stock_id = 5 and stock_num = stock_num;

这种方案类似一个乐观锁,只有更新时库存数量和查询时的库存数量相等才能更新。
这个方案虽然操作不具有原子性,但却是可以保证线程安全,生产环境中可以使用这种方法。
但是缺点就是如果并发量很大,那会存在非常多更新失败的情况。

方案三:用一条SQL来实现扣减库存

update table set stock_num = stock_num - $reduce where id = 5 and stock_num >= $reduce;

这样一条SQL就能解决库存扣减问题,不会出现并发问题,生产环境推荐使用此方案。
但是也有缺点:就是如果上游业务因为触发重试,会导致多扣库存的情况,所以需要做幂等校验,防止库存多扣的情况。

方案四:通过事务和MySQL的锁来解决

开启事务
查询时使用for update来将查询的数据加上锁,让其他事务中不可读。
select stock_num from table where id = 5 for update
然后计算数量更新库存
提交事务
这种方式也是可以使用的,但是在分布式事务的情况下就不能使用这种方式了,而且性能极低。

方案五:使用Redis,利用Redis的原子性减操作

decr命令可以实现原子操作,如果扣减结果为负数了会扣减失败。
使用Redis系统的复杂度就提升了,要考虑很多情况了,如:Redis挂了怎么办,数据一致性问题等等。
只使用数据库来扣减库存,肯定是扛不住非常多的并发的,所以如果并发量非常大的情况,是必须要使用redis的,虽然会带来许多问题,但是也是有解决方案的。

因为我此次所做的库存系统是内部系统,没有很大的并发量,所以就没有研究使用Redis来扣减库存的方案,大家如果遇到了可自行研究一番。

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

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

相关文章

利用 IDEA IDE 的轻量编辑模式快速查看和编辑工程外的文本文件

作为程序员, 我们都知道 IDE 的很好用的, 它的文本编辑器功能也非常的强大, 用起来非常便捷. 在长年累月的使用中, 我们也变得对其非常熟悉, 以致于使用起其它简单地轻量级的文本编辑器来, 比如什么记事本, Notepad, UltraEdit 等等呀, 觉得既不方便又不熟悉. 关键是很多的操作…

Vue-4: 组件通信学习

Vue-4 文章目录 Vue-401-scoped组件的样式冲突scoped原理 02-data是一个函数代码 03-组件通信组件关系分类:父子关系组件的使用 04-props详解01-prop作用特点 02-props 校验03-prop & data 单向数据流 05-小黑记事本(组件版)核心步骤添加…

Linux:基础指令

目录 Linux的基础指令 1.ls指令 2.pwd指令 3.cd指令 4.touch指令 5.mkdir指令 6.rmdir指令和rm指令 7.man指令(重要) 8.cp指令(重要) 9.mv指令(重要) 10.cat指令 11.nano指令 12.more指令 13.…

Go 1.21新增的 maps 包详解

maps 包提供了几个非常有用的用于操作 map 类型(任何类型的 map)的函数,本文接下来详细介绍下这几个函数。 maps.Clone 定义如下: func Clone[M ~map[K]V, K comparable, V any](m M) M 返回 m 的一个副本,因为新的…

PHP8的匿名函数-PHP8知识详解

php 8引入了匿名函数(Anonymous Functions),它是一种创建短生命周期的函数,不需要命名,并且可以在其作用域内直接使用。以下是在PHP 8中使用匿名函数的知识要点: 1、创建匿名函数,语法格式如下&…

Oracle-rolling upgrade升级19c

前言: 本文主要描述Oracle11g升19c rolling upgrade升级测试,通过逻辑DGautoupgrade方式实现rolling upgrade,从而达到在较少停机时间内完成Oracle11g升级到19c的目标 升级介绍: 升级技术: rolling upgrade轮询升级,通过采用跨版…

transform_train.json文件解析

transform_train.json 文件内容解析transform_matrix 文件内容解析 {"camera_angle_x": 0.6911112070083618,"frames": [{"file_path": "./train/r_0","rotation": 0.012566370614359171,"transform_matrix": [[…

快速掌握MQ消息中间件rabbitmq

快速掌握MQ消息中间件rabbitmq 目录概述需求: 设计思路实现思路分析1.video 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,c…

02.sqlite3学习——嵌入式数据库的基本要求和SQLite3的安装

目录 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模型 ubuntu 22.04下的SQLite安装 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模…

2023-08-27力扣每日一题-QWQ

链接&#xff1a; 56. 合并区间 题意&#xff1a; 如题 解&#xff1a; 排序题&#xff0c;先将最早出现且最大的区间放在前面即可&#xff0c;差一点就要补卡了 23:59通过 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; class Solution { pu…

Eclipse(STS):pom.xml 报错:Multiple markers at this line

pom.xml 报错&#xff1a;Multiple markers at this line STS中&#xff0c;项目能够正常运行&#xff0c;但是 pom.xml 报错&#xff1a;Multiple markers at this line 项目本身没有任何修改&#xff0c;之前不报错的&#xff0c;突然报错了。 Multiple markers at this li…

LLM-Rec:基于提示大语言模型的个性化推荐

1. 基本信息 论文题目:LLM-Rec: Personalized Recommendation via Prompting Large Language Models 作者:Hanjia Lyu, Song Jiang, Hanqing Zeng, Yinglong Xia, Jiebo Luo 机构:University of Rochester, University of California Los Angeles, Meta AI, University of Ro…

手写RPC框架--1.介绍与网络传输

介绍与网络传输 0.介绍a.什么是rpcb.rpc的通信流程 1.网络传输a.零拷贝1) 零拷贝的概念2) Netty的零拷贝 b.IO多路复用c.Netty入门1) netty中的helloworld d.封装报文1) 协议结构2) 模拟封装报文 e.序列化f.压缩和解压缩 0.介绍 a.什么是rpc rpc 的全称是 Remote Procedure C…

计算机视觉 – Computer Vision | CV

计算机视觉为什么重要&#xff1f; 人的大脑皮层&#xff0c; 有差不多 70% 都是在处理视觉信息。 是人类获取信息最主要的渠道&#xff0c;没有之一。 在网络世界&#xff0c;照片和视频&#xff08;图像的集合&#xff09;也正在发生爆炸式的增长&#xff01; 下图是网络上…

HTML5-2-链接

HTML使用标签 <a>来设置超文本链接。 超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分。 默认情况下&#xff0c;链接将以以下形式出现在浏览器中&am…

Python高阶函数

高阶函数是在Python中一个非常有用的功能函数&#xff0c;所谓高阶函数就是一个函数可以用来接收另一个函数作为参数&#xff0c;这样的函数叫做高阶函数。高阶函数是函数式编程的基本前提。 函数在 Python 是一等公民&#xff08;First-Class Object&#xff09;&#xff0c;…

数据结构】二叉树篇|超清晰图解和详解:后序篇

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 你不能要求一片海洋&#xff0c;没有风暴&#xff0c;那不是海洋&#xff0c;是泥塘——毕淑敏 目录 一、核心二、题目 一、核心 我们清楚…

wireshark过滤器的使用

目录 wiresharkwireshark的基本使用wireshark过滤器的区别 抓包案例 wireshark wireshark的基本使用 抓包采用 wireshark&#xff0c;提取特征时&#xff0c;要对 session 进行过滤&#xff0c;找到关键的stream&#xff0c;这里总结了 wireshark 过滤的基本语法&#xff0c;…

帝国CMS仿管理资源吧资料下载网站模板源码/下载会员+积分付费下载功能自动采集资源网站源码

帝国CMS仿管理资源吧资料下载网站模板源码&#xff0c;带下载会员积分付费下载功能自动采集资源网站源码&#xff0c;管理资源吧——为中小企业管理者提供全方位的管理资料下载服务&#xff1b;是一个所有资料免费下载&#xff0c;免注册、免登陆、免积分的公益性的管理知识共享…

PDF校对工具正式上线,为用户提供卓越的文档校对解决方案

为满足当下对数字化文档校对的精准需求&#xff0c;我们今日正式发布全新的PDF校对工具。经过深入的技术研发与细致的测试&#xff0c;该工具旨在为企业和个人用户带来一个高效且准确的PDF文档校对平台。 PDF校对工具的主要特性&#xff1a; 1.全面性校对&#xff1a;工具支持…