加锁失效,非锁之过,加之错也|京东零售供应链库存研发实践

本文导读

从事京东零售供应链库存业务,库存数量操作增减十分频繁,并且项目开发中会常常遇到各种并发情况,一旦库存数量操作有误,势必给前台销售产生损失影响,因此需要关注对库存数量并发操作下的一致性问题。 

大部分情况下,加锁可以很好地解决并发问题,但是只要加上锁后就一定不会有并发问题吗?哪些情况下引起锁失效呢?本文会以一个真实的线上案例来剖析业务处理加锁过程易使用不当的点以及对应的解决方案。

 

引言

多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题。

比如:银行两操作员同时操作同一账户就是典型的例子。比如A、B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户减去 50元,A先提交,B后提交。最后实际账户余额为1000-50=950元,但本该为1000+100-50=1050。这就是典型的并发问题。

从事零售供应链库存业务,对库存数量操作增减十分频繁,同样存在类似上述银行取款遇到的问题,库存数量操作有误势必给前台销售产生损失影响,因此需要关注对库存数量并发操作下的一致性。

下面通过一个真实的案例分享在并发情况下如何保证库存数量的准确性。

 

问题是什么-加锁失效

看看下面这段流程和代码,思考会有并发问题吗?

图片

1.加锁前,获取箱子明细数据,此处在锁之外,存在并发脏读问题

图片

2.加锁后,并进行箱子上架分批次回传业务处理

图片

3.加锁后,更新箱子明细上架数量逻辑:已上架数量 = 加锁前的明细数据(脏读) + 报文回传的明细数据 直接进行行更新

图片

 

原因是什么-加锁的位置不正确

图片

核心的问题原因

1.业务分布式锁失效:使用分布式锁加锁了,但是仍然使用加锁前查询的数据,导致出现脏读

2.Mysql锁失效:数据库更新时,未上任何锁,导致脏读的数据直接覆盖更新当前行

有同学这时问了,为啥防重码也没有生效呢?

防重码主要是用作幂等逻辑的,同一个请求多次处理,结果仍然是相同的。

但是这是两次不同的请求,防重码是不同的,因此不能只依赖防重码保证一致性。

解决方案有哪些

1、代码层面:使用锁(如互斥锁、读写锁、分布式锁等)来控制资源的访问,数据获取的全部操作都需要再获取锁后才进行。

将获取箱子明细的代码移动到加锁之后,只有获取到分布式锁,才能执行分批次上架查询和更新(串行化)

图片

对应改造后的代码:

图片

2、数据库层面:实现事务管理,确保数据的一致性;合理设置事务隔离级别,以防止脏读、或者采用乐观锁或悲观锁来处理并发更新,合理设计查询效率,减少锁竞争。

数据库的并发上锁处理和业务代码的上锁是互补的关系

因为无法保证后续业务的调整或其他业务代码的调用能始终保持获取数据的一致性,数据库的并发上锁处理更多是一种兜底保证机制。

乐观锁更新

图片

悲观锁更新

图片

扩展方案

应用程序设计:在应用程序设计阶段,尽量避免长时间持有数据库连接或事务,减少并发操作的可能性,利用AI代码评审或者人工提前找出可能出现并发问题的地方;合理设置锁的粒度,避免锁失效。

网络负载层面:采用限流控制访问频率;采用分布式数据库,进行数据分片,降低单节点并发压力;使用负载均衡,将网络请求分发到不同的服务器,提高系统处理并发的能力,防止系统过载。

请求层面:前端点击防重、系统幂等防重、尽可能降低同一请求的多次重试访问引起的一致性问题。

通过以上措施,可以在不同层面有效地防止并发问题,保证系统的数据的一致性。

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

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

相关文章

FileLink如何帮助医疗行业实现安全且高效的跨网文件交换

在当今数字化时代,医疗行业在快速发展的同时,也面临着数据安全和信息流转效率的双重挑战。患者的健康记录、影像数据、检查报告等大量敏感信息需要在不同医院、诊所、实验室和保险公司之间高效、迅速地传递。然而,传统的邮件、传真和纸质文件…

Nginx:我自己的网站

一、Nginx的简介 Nginx是一款轻量的级的HTTP服务器,也是一款邮箱代理服务器,同时具备反向代理,通用TCP/UDP代理功能。 Nginx可以运行在x86、ARM等多种平台上,同时支持Linux、windows等主流的操作系统 二、Nginx的特点 1、支持高并…

qt QDropEvent详解

1、概述 QDropEvent是Qt框架中用于处理拖放释放事件的一个类。它允许开发者在用户界面中更好地管理和处理拖放操作,从而实现交互式和响应式的应用程序。QDropEvent类提供了处理拖放释放事件所需的方法和信号,使得开发者能够轻松地实现拖放功能&#xff…

数据中台一键大解析!

自从互联玩企业掀起了数据中台风,数据中台这个点马上就火起来了,短短几年数据中台就得到了极高的热度,一大堆企业也在跟风做数据中台,都把数据中台作为企业数字化转型的救命稻草,可是如果我告诉你数据中台并不是万能钥…

vue props无法被watch

描述 使用父子组件prop传参的时候,无法侦听。 解决: 原来代码: watch(props.XXXX, () > {console.log(1)})添加两个默认参数: watch(props.XXXX, () > {console.log(1)}, {deep: true, immediate: true})原因&#xff…

C++设计模式结构型模式———组合模式

文章目录 一、引言二、组合模式三、总结 一、引言 组合模式是一种结构型设计模式, 可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。代码实现中涉及了递归调用。组合模式与传统上的“类与类之间的组合关系”没有关联,不…

Java 中的 ThreadLocal:线程内的私有数据存储

在 Java 并发编程中,线程之间共享数据可能会导致复杂的同步问题,例如数据竞争、死锁等。然而,某些场景中我们希望变量只在某个特定线程中存在,这样每个线程都有自己的变量副本,从而避免了共享状态带来的问题。ThreadLo…

如何查看当前linux系统信息

1.查看Linux发行版信息,(如centos7) cat /etc/os-release2.查看内核版本 uname -r3.查看硬件信息 查看cpu信息: lscpu查看内存信息: free -h查看硬盘使用情况 df -h查看系统硬件(包括cpu、内存、硬盘等详细信息 lshw…

Maven项目的基础配置:利用IDEA将SpringBoot的项目打包成war文件

文章目录 引言Maven项目的聚合与继承(依赖管理)把项目打包成war包其他打包配置引言 利用IDEA将SpringBoot的项目打包成war文件Maven项目的聚合与继承(依赖管理)Maven项目的聚合与继承(依赖管理) 把项目打包成war包 利用IDEA将SpringBoot的项目打包成war文件:要配置启动…

基于vue框架的的奶茶店预约订单系统3fb55(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,奶茶分类,奶茶信息 开题报告内容 开题报告 题目:基于Vue框架的奶茶店预约订单系统开发 一、研究背景与意义 背景 随着饮品市场的蓬勃发展,奶茶店作为其中的重要组成部分,其业务量和顾客需求持…

Interpreter 解释器模式

1 意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示》解释语言中的句子。 2 结构 AbstactExpression 声明一个程序的解释操作,这个接口为抽象语法树中所有的结点所共享。TemminalExpression 实…

【数据结构】哈希思想详解

目录 前言1. unordered系列关联式容器1.1 unordered_map1.1.1 unordered_map介绍1.1.2 接口说明 1.2 unordered_set 2. 哈希概念3. 哈希冲突4. 哈希函数5. 哈希冲突解决5.1 闭散列5.1.1 闭散列的概念5.1.2 闭散列代码实现 5.2 开散列5.2.1 开散列概念5.2.2 开散列代码实现5.2.3…

LEFT JOIN和INNER JOIN 以及 FOR ALL ENTRIES IN

【在写开发报表的时候,遇到多表取数,重温数据库里面的集中多表取数的方法。】 在ABAP开发中,JOIN、LEFT JOIN、INNER JOIN以及FOR ALL ENTRIES IN是用于将两个或多个表中的数据结合起来的不同方法。以下是它们之间的主要区别和使用方…

元戎启行嵌入式面试题及参考答案

介绍下 CAN 通信原理 控制器局域网(CAN)是一种串行通信协议,主要用于汽车、工业自动化等领域的电子控制单元(ECU)之间的通信。 其通信原理是基于多主站架构。在总线上,多个节点(设备)都可以主动发起通信。CAN 协议使用差分信号来传输数据,通过两条信号线 CAN_H 和 CAN…

变异凯撒(Crypto)

目录 解题思路 题目设计原理 总结 解题思路 从题目可以看出,这是凯撒密码,原理应该还是整体偏移,但是变异了。 凯撒密码只有字母的横移,而通过观察我们可知,加密密文包含大小写字母、特殊字符,于是猜想大…

光伏无人机踏勘,照亮光伏未来!

光伏电站选址地分散在各地,想要精准获取该地的地形特点与屋顶面积等信息,传统的人工踏勘耗时耗力且精度无法保证,难以满足现代光伏项目的规模快发发展需求。光伏无人机踏勘,照亮光伏未来! 在光伏无人机智能踏勘设计系统…

Nvidia突袭AI江湖!悄悄发布新模型,完爆OpenAI和Anthropic?

你以为Nvidia只会造芯片?太天真了!这家GPU巨头刚刚在AI语言模型领域上演了一出惊天逆袭,让OpenAI和Anthropic都措手不及。 没有轰轰烈烈的发布会,没有铺天盖地的宣传,Nvidia就这么静悄悄地在Hugging Face平台上扔出了一…

一. nginx学习笔记 又长又臭篇幅

目录 引言 Nginx 简介 Nginx 的特点和优势 适用场景 安装 Nginx 在 Windows 上安装 Nginx 在 Linux (CentOS)上安装 Nginx 基本配置 Nginx 配置文件结构 启动、停止和重载 Nginx 基本的服务器块配置 处理静态文件 设置文档根目录 配置 MIM…

Hive SQL中判断内容包含情况的全面指南

Hive SQL中判断内容包含情况的实用指南 在 Hive SQL 的数据处理与分析世界里,判断字段是否包含特定内容是一项非常重要的操作。今天,我将为大家详细介绍 Hive SQL 中实现这一功能的多种方法,并附上相应的表创建和数据插入语句。 一、准备工作 - 表创建与数据插入 首先,我…

es 数据清理delete_by_query

POST /索引名/_delete_by_query?conflictsproceed&scroll_size2000&wait_for_completionfalse&slices36 {"size": 2000, "query": {"bool": { "must": [{"terms": {"rule_id": [800007]}}]}} }slice…