并发控制:确保数据一致性的策略

引言

​ 在现代软件开发中,尤其是在涉及高并发场景的应用,如在线购物、金融交易等,保证数据操作的原子性和一致性是至关重要的。本文将深入探讨并发环境下常见的问题,以及如何通过先进的技术手段确保数据的准确性和安全性。

案例分析:库存扣减的并发挑战
背景设定

​ 设想一个在线电商平台,其后端数据库中有一个名为 stock 的库存数据表,其中 stock_num 字段记录了商品的库存数量。

并发扣减库存的问题

​ 在高流量的购物节期间,库存扣减操作变得尤为关键。一个典型的扣减操作可能是执行如下 SQL 语句:

UPDATE stock SET stock_num = stock_num - 1 WHERE product_id = X;

以上操作会产生什么问题?

​ **不幂等:**当上次语句重复执行的时候会导致多次扣减库存,为什么会重复执行,比如业务侧重试、数据库代理重试等,因此我们可以先查出库存数量,得出新库存等于 new_stock = stock_num - 1, 最终语句如下:

update stock set stock_num = new_stock

​ **超卖:**并发场景解决了不幂等问题之后依然存在超卖问题,假如库存剩余1,两个并发请求同时查询库存为1,此时 new_stock_num = 1-1 ,两个请求同时执行 update stock set stock_num = new_stock_num,只有一个库存却卖出两件

怎么解决超卖问题

CAS(Compare-And-Swap) 机制的应用:我们在语句后面加上库存数量判断即可 ,然后根据 affetc row 0或1判断执行有没有成功,语句如下:

 update stock set stock_num  = new_stock_num where stock_num = old_stock_num

解决以上问题就万事大吉了吗,其实以上写法还有可能存在经典 ABA 问题

深入探讨:ABA 问题的识别与解决

​ 尽管 CAS 机制可以解决不幂等性和超卖问题,但它本身也有局限性,即所谓的 ABA 问题。ABA 问题描述了在并发编程中,一个值从 A 变为 B,再变回 A,而 CAS 操作却可能错误地认为值未发生变化。

举例解释:

  1. 张三去银行取钱,余额有 200 元,张三取 100 元,但因为程序的问题,启动了两个线程,线程一和线程二进行比对扣款,线程一获取原本有 200 元,扣除 100 元,余额等于 100 元 - 此时余额是100

  2. 李四给张三转账 100 元,于是启动了线程三抢先在线程二之前执行了转账操作,把 100 元又变成了 200 元 - 经过转账又变成了200

  3. 此时线程二对比自己事先拿到的 200 元和此时经过改动的 200 元值一样,就进行了减法操作,把余额又变成了 100 元 - 线程2是步骤一异常启动的线程,我们期望线程2不应该扣款但由于执行语句的判断条件是 old_money=200, 由于 ABA 问题导致条件判断成功,导致多扣了100

解决方案:引入版本号

​ ABA 问题的核心原因是因为被更新的变量会有加减操作,所以导致值会在新老数值之间变动,如果值只加不减,那么判断条件是不是就可以成立了,所以我们可以引入一个版本号字段 version,此时更新语句变成:

update stock set stock_num  = new_stock_num, version = new_version where stock_num = old_stock_num and version = old_version
Reference
  1. 深入理解 CAS 和 ABA 问题

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

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

相关文章

安全生产管理系统——特殊作业管控

特殊作业环节面临事故多发、频发、死亡率高,如何做到有效管理是一大考验,进行系统全面的规整很有必要。安全生产管理系统中特殊作业管理通过整合资源和采用信息化技术对动火、受限空间、盲板抽堵、高处、吊装、临时用电、动土、断路等特殊作业全过程管理…

让UI和前端相亲相爱的秘诀:与人方便,自己方便。

在实际项目开发中,UI设计师和前端开发人员经常互撕,这背后的原因是什么?有什么办法可以避么?贝格前端工场在这里为大家解读一下。 一、UI和前端互厮的原因有哪些? 导致UI和前端在写作过程中出现盲区导致互撕的原因可…

HTML表单深度解析:构建互动的网页界面

表单是HTML中用于收集用户输入信息的重要元素&#xff0c;是网页与用户交互的关键组件。以下是一个典型的HTML表单示例&#xff0c;我们将会详细解析其中的各个元素及属性含义。 <form action"https://xx.xxx.xx/search" target"_self" method"ge…

SAP 外币金额汇率转换

一、说明 汇率维护在ERP中可以使用事务代码OB07或者OB08&#xff0c;每次不同币别的汇率更改在正式生产系统中都会新创建一条记录&#xff0c;保存之后会存储在表TCURR中&#xff0c;可以通过函数CONVERT_TO_LOCAL_CURRENCY转换获取&#xff08;注意函数Exporting中各个参数一定…

代码随想录算法训练营DAY38| 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

理论基础 动态规划的解题步骤 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 509. 斐波那契数 题目链接&#xff1a;509. 斐波那契数 class Solution(object):def fib(self, n):""":t…

第二十章 迭代器模式

目录 1 迭代器模式介绍 2 迭代器模式原理 3 迭代器模式实现 4 迭代器模式应用实例 5 迭代器模式总结 1 迭代器模式介绍 迭代器模式(Iterator pattern)又叫游标&#xff08;Cursor&#xff09;模式&#xff0c;它的原始定义是&#xff1a;迭代器提供一种对容器对象中的各…

如何使用new和delete操作符进行动态内存分配和释放?

在C中&#xff0c;new 和 delete 操作符用于在堆&#xff08;heap&#xff09;上动态地分配和释放内存。这是管理内存的一种重要方式&#xff0c;特别是在需要创建可变数量或生命周期与程序执行流程不一致的对象时。 使用 new 进行动态内存分配 当你使用 new 操作符时&#x…

Redis 五种基本数据类型及场景

Spring Boot 与 Redis 的集成可以使用 Redis 提供的五种基本数据类型来解决不同的使用场景。以下是每种类型及其使用场景和示例代码。 1. String 使用场景&#xff1a;缓存简单的键值对&#xff0c;如计数器、字符串缓存等。 示例&#xff1a; Autowired private StringRed…

展出特种级水下机器人(博雅工道) —2024青岛军博会(智能装备与通信技术)

深蓝探索&#xff0c;智慧融合 —— 2024中国军民两用智能装备与通信技术产业展览会 在科技的浪潮中&#xff0c;我们迎来了一个全新的时代——智能装备与通信技术正重塑着我们的世界。2024年&#xff0c;中国将举办一场具有里程碑意义的科技盛会——"2024中国军民两用智…

下载mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar操作教程

1、下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 2、截图如下

electron录制工具-视频保存、编辑页面

效果如下 electron录屏-保存录制视频 资源 导出视频使用了 mp4-wasm&#xff0c;基本使用&#xff0c;可参考 此文 想法 1、点击按钮导出&#xff0c;弹出选择保存文件夹 2、保存成功后&#xff0c;自动打开保存后文件夹窗口并关闭窗口 实现 获取保存文件夹路径&#xff0…

Python有哪些就业方向?就业市场广阔!

Python是一种跨平台的计算机程序设计语言&#xff0c;是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python语言在人工智能的发展下&#xff0c;越来越多计算机企业开始广泛使用&#xff0c;同时Python的就业方向也逐渐广阔。 YesPMP为学习Python的技术人员…

linux中acl策略+文件权限

文档归属的局限性 - 任何人只属于三种角色&#xff1a;属主 属组 其他人- 无法实现更精细的控制 acl访问策略 - 能够对个别用户个别组设置独立的权限- 大多数挂载ext3/4,xfs文件系统默认已支持 Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...setfacl [选项] u:用户名…

如何 用JavaSpringBoot生成二维码与条形码

前言 在当今的数字化转型浪潮中&#xff0c;二维码已经成为了一种不可或缺的信息交流手段。从产品标签到活动宣传单&#xff0c;再到电子支付&#xff0c;二维码的应用无处不在。本文将详细指导您如何在Spring Boot应用程序中集成ZXing库&#xff0c;以实现QR码的创建和解析功能…

ORA-10458 ORA-01152 :file 1 was not restored from a sufficiently old backup

问题 dg搭建后开库报错 SQL> alter database open; alter database open * ERROR at line 1: ORA-10458: standby database requires recovery ORA-01152: file 1 was not restored from a sufficiently old backup ORA-01110: data file 1: /u01/app/oracle/oradat…

部署大模型LLM

在autodl上部署大模型 windows运行太麻烦&#xff0c;环境是最大问题。 选择云上服务器【西北B区 / 514机】 cpp (c c plus plus) 纯 C/C 实现&#xff0c;无需外部依赖。针对使用 ARM NEON、Accelerate 和 Metal 框架的 Apple 芯片进行了优化。支持适用于 x86 架构的 AVX、…

基于文本和图片输入的3D数字人化身生成技术解析

随着虚拟现实、增强现实和元宇宙等技术的飞速发展,对高度逼真且具有表现力的3D数字人化身的需求日益增长。传统的3D数字人生成方法往往需要依赖大量的3D数据集,这不仅增加了数据收集和处理的成本,还限制了生成的多样性和灵活性。为了克服这些挑战,我们提出了一种基于文本提…

Elasticsearch出现Connection reset by peer

Elasticsearch出现Connection reset by peer分析 1.异常&#xff1a; 2024-06-13 13:17:10.539 WARN [http-nio-30411-exec-9]com.longdaotech.config.ESConfig -onFailure node:[hosthttp://192.168.239.253:9200] 2024/6/13 13:17:10 2024-06-13 13:17:10.541 WARN [http-n…

C#语言进阶(一)—委托 第二篇

总目录 C# 语法总目录 委托 第二篇 委托 第二篇4.实例对象方法、静态方法与委托之间的关系5. 委托类型参数为泛型6. System空间下的 Func 委托和 Action 委托 委托 第二篇 4.实例对象方法、静态方法与委托之间的关系 这里实例对象方法指的是 new 出来的一个对象&#xff0c;它…

结构设计模式 - 桥接设计模式 - JAVA

桥接设计模式 一. 介绍二. 桥接模式示例2.1 定义实现部分和具体实现2.2 定义抽象部分和细化抽象部分2.3 测试2.4 解释 三. 结论 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一.…