使用乐观锁更新mysql库存,保证数据一致性

- 技术笔记,巩固知识点

- 记录工作实战

一、背景

1.就像多线程更新同一临界资源,需要加CAS锁或Aync(synchronized、RentrantLock),保证数据安全

2.多个请求,修改同一条的mysql记录的某个数值,也需要加锁(mysql层次的乐观锁)

3.加同步锁:效率太低

4.不加锁:mysql 多版本控制机制,每个事务看到的都是自己的副本(就像多核cpu,每个核只能看到自己的缓存副本),会导致数据更新不一致问题

mysql 乐观锁实现

    /*** 乐观锁更新库存,库存不能为负数* @param id* @param stock 入参* @return* @author Administrator* @date 2024/5/28 17:50**/public void changeStockByIdWithVersion(Integer id, BigDecimal stock) {Assert.isTrue(stock.compareTo(BigDecimal.ZERO)>=0, "更新失败:欲更新库存为负数");TailoringStockManagementEndProductStock db = getById(id);boolean update = lambdaUpdate().set(ProductStock::getPurchaseQuantity, stock).set(ProductStock::getVersion, db.getVersion() + 1).set(ProductStock::getUpdateBy, AuthUtil.getName()).set(TailoringStockManagementEndProductStock::getUpdateAt, LocalDateTime.now()).eq(ProductStock::getId, id).eq(ProductStock::getVersion, db.getVersion()).update();Assert.isTrue(update, "更新失败:乐观锁未锁中,请重新操作");}

mysql 乐观锁原理论述

并发情况,事务A在获取原库存、计算最终库、执行sql之前,这段时间内,事务B已把库存修改提交,此时事务A再更新,会覆盖掉事务B的更新。

简单说,事务A开启时,拿到数据快照,相当于拿到了库存的副本。

要想保证数据更新,必须要保证在事务A期间,没有别的事务更新。也就是version没有变化。

在实现时,只需在执行sql之前获取一下version(同一个事务内,任何时候任何地方时候获取version都是一样的,简化实现,直接紧贴在更新sql前一行),作为更新条件。根据返回的true false 判断是否命中。false则要抛异常,通知用户重试

其它简单方案

使用分布式锁,将库存的id 作为key, 同一条库存同一时间只允许一个事务更新

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

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

相关文章

1794 jsp蛋糕店管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 蛋糕店管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

进口铸铁气动隔膜泵的性能

进口铸铁气动隔膜泵的性能可以总结如下: 流量与扬程: 流量范围:0-20m/h,表明泵能够处理不同规模的液体流量需求。扬程:30m,显示了泵能够提供的液体提升高度,适用于需要液体输送至一定高度的应用…

展示设计都有哪些特点

一、全面性 给设计师展示了一场多学科、综合性的艺术创作活动,涉及艺术美学、规划管理、建筑结构、装饰材料、石材营销、场地布置与规划、广告学、光学等多个学科。同时,设计师在绘画、摄影、雕塑、预算、电脑操作等方面也有一定的技能。因此&#xff0c…

精酿啤酒:品质与口感对啤酒消费趋势的影响

随着消费市场的不断变化,啤酒消费趋势也在发生着演变。在这个过程中,品质与口感成为了影响啤酒消费趋势的重要因素。对于Fendi club啤酒而言,其卓着的品质和与众不同的口感对啤酒消费趋势产生了深远的影响。 品质的提升是推动啤酒消费趋势发展…

realsense-D405 ros1驱动

使用源码安装的方式,安装realsense-ros 。(Installation Instructions中的Method 2: The RealSense™ distribution)直接运行roslaunch realsense2_camera rs_camera.launch会报错。修改src/realsense-ros/realsense2_camera/include/constan…

测试报告模板

项目名称 { 测试报告标题 } 1. 基本信息 测试计划的来源提示:填写《测试计划书》名称,版本,时间测试用例的来源提示:填写《测试用例》名称,版本,时间测试对象描述测试环境描述测试驱动程序描述提示&…

element-ui组件table去除下方滚动条,实现鼠标左右拖拽移动表格

时隔多日,再次遇到值得记录的问题。 需求 项目前端使用vue框架,页面使用element-ui进行页面快速搭建。默认的table组件当表格过长时,下方会出现横向的滚动条,便于用户对表格进行左右滑动。考虑到页面美观问题,滚动条…

【源码】6语言跨境电商PHP源码 精美UI+功能强大开源无授权

6语言跨境电商PHP源码 精美UI功能强大开源无授权 英文,简体中文,繁体中文,日语、泰语、越南语6语言。功能非常强大,UI也很漂亮的跨境电商源码。基于国外成熟电商系统二开的源码,带POS系统。 系统采用Laravel框架开发…

面试专区|【DevOps-20道Logstash高频题整理(附答案背诵版)】

简述什么是Logstash ? Logstash是一个开源的数据收集引擎,具备实时管道处理能力。它可以从多个来源采集数据,进行转换,然后将数据发送到指定的存储库。官方介绍Logstash为“具备实时数据传输能力的管道”,能将数据从输…

常见文本分类小模型

1.TextRNN 模型结构:embedding BiLSTM linear 2.FastText 模型结构:mean(3✖️embedding) linear 3.TextRCNN 模型结构:embedding BiLSTM Maxpool linear 4.TextCNN 模型结构:embedding 3✖️(conv Maxpool) line…

[C][符号]详细讲解

目录 1.算术操作符2.接续符和转义符 \1.续行符使用2.转义 3.单引号和双引号4.逻辑运算符5.位运算符6.移位操作符7. --操作8.条件操作符9.逗号表达式10.操作符的属性 1.算术操作符 算术操作符: - * / %除了%操作符以外,其他的几个操作符可以作用于整数和…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第31课-循环动画

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第31课-循环动画 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&am…

科学技术创新杂志科学技术创新杂志社科学技术创新编辑部2024年第10期目录

科技创新 单桩穿越岩溶发育地层力学特征与溶洞处置措施研究 刘飞; 1-7《科学技术创新》投稿:cnqikantg126.com 基于多目标优化的中低压配电网电力规划研究 向星山;杨承俊;张寒月; 8-11 激光雷达测绘技术在工程测绘中的应用研究 张军伟;闫宏昌; 12-15 …

Python爬虫技术深度解析与实战案例

一、引言 随着互联网的快速发展,网络数据已成为人们获取信息、进行研究的重要资源。Python作为一种功能强大且易于学习的编程语言,在爬虫领域有着广泛的应用。本文将详细介绍Python爬虫技术的基本原理、核心组件,并通过一个实战案例展示Pyth…

LeetCode516:最长回文子序列

题目描述 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 代码 /*dp[i][j]:[i,j]的回文子序列长度为d…

泰迪智能科技数据分析工程师项目班(线上班)课程安排介绍

泰迪智能科技数据分析工程师项目班旨在帮助学员掌握数据分析的基本理论和实践技能,通过理论教学和实践项目结合,全面提升学员的数据分析能力。 数据分析工程师项目班课程特色: 1.课程内容前沿,实用性强 课程…

51 html网页

上节内容的网页是hello world的字符串,但实际上网页应该是html格式的这种超文本标记语言,这一节完善一下网页的各种格式和内容 分文件 实际服务器中,网页的界面应该单独放一个文件,服务器从文件里读取网页的内容 先创建一个wroo…

QT学习备份

2023年1月2日09:00:32 1.信号/槽编辑器 发送者:控件 信号:是控件发出的信号 接受者:包含控件的容器 槽:程序上用slot标识的方法 2.Q_OBJECT宏 只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用…

uniapp实现蓝牙自动连接并获取心电图(代码篇)

我们最近的项目是需要写一个app和公司设备通过蓝牙连接,并且获取到心电图,这次是实现自动的,用户在第一次的时候需要点击连接蓝牙实现自动连接,后续更是不需要点击直接获取心电图,直接上代码,供大家参考&am…

【管理咨询宝藏118】集团公司人力资源共享服务中心建设方案

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏118】集团公司人力资源共享服务中心建设方案 【格式】PDF版本 【关键词】人力资源、共享服务、顶级咨询 【核心观点】 - 本项目立足集团公司的人…