分布式锁之-mysql

embedded/2025/1/15 17:37:02/

使用mysql实现分布式锁的方式这里演示两种:
1:基于 MySQL 实现的乐观锁
2:基于 MySQL 实现的悲观锁
数据库脚本

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for product_stock
-- ----------------------------
DROP TABLE IF EXISTS `product_stock`;
CREATE TABLE `product_stock`  (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`stock` int(11) NULL DEFAULT 0,`version` int(11) NULL DEFAULT 0,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '产品库存表\n' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of product_stock
-- ----------------------------
INSERT INTO `product_stock` VALUES (1, 20,0);SET FOREIGN_KEY_CHECKS = 1;

使用悲观锁实现

  * 模拟减库存操作 - MySQL 悲观锁 实现** @return str*/@GetMapping("/reduceStockGloomy/{id}")public String reduceStockGloomy(@PathVariable("id") Integer id) {return productStockService.reduceStockGloomy(id);}

业务实现

 /*** 基于 MySQL 实现分布式锁(悲观锁)* 悲观锁 :* 查询的时候,不管有没有线程竞争,都在 MySQL层面就加上了锁 ,* 所以,整个操作,必须要在一个事务中才行,这里通过 @Transactional** @param id id* @return String*/@Override@Transactional(rollbackFor = Exception.class)public String reduceStockGloomy(Integer id) {// 加锁查询ProductStock stock = productStockMapper.selectForLock(id);if (stock != null && stock.getStock() > 0) {productStockMapper.reduceStock(id);} else {throw new RuntimeException("库存不足!");}return "ok";}

乐观锁实现

/*** 模拟减库存操作 - MySQL 乐观锁 实现** @return str*/@GetMapping("/reduceStock/{id}")public String reduceStockOptimism(@PathVariable("id") Integer id) {return productStockService.reduceStockOptimism(id);}
/*** 乐观锁:* 我认为我操作之前不会有人操作,如果有人操作了,那我再来一次,即为无锁操作** @param id id* @return String*/@SneakyThrows@Overridepublic String reduceStockOptimism(Integer id) {ProductStock stock = productStockMapper.selectById(id);if (stock != null && stock.getStock() > 0) {int i = productStockMapper.reduceStockOptimism(id, stock.getVersion());// i = 0 表示没有修改成功,说明有别人在你修改之前 已经修改了数据;需要重新再调用下当前方法if (i == 0) {// Thread.sleep 防止栈溢出// Thread.sleep(10);this.reduceStockOptimism(id);}} else {throw new RuntimeException("库存不足!");}return "ok";}

xml中的版本号的作用

<update id="reduceStockOptimism">update product_stockset stock   = stock - 1,version = version + 1where id = #{id}and version = #{version}</update>

以上的是分布式锁之-mysql 若需完整代码 可识别二维码后 给您发代码。
若友友们有更好的分布式锁的实现方式 请在评论区留下你可贵的分享 谢谢!!!!
在这里插入图片描述


http://www.ppmy.cn/embedded/32575.html

相关文章

【Python】机器学习之Sklearn基础教程大纲

机器学习之Sklearn基础教程大纲 1. 引言 机器学习简介Scikit-learn&#xff08;Sklearn&#xff09;库介绍安装和配置Sklearn 2. 数据预处理 2.1 数据加载与查看 - 加载CSV、Excel等格式的数据- 查看数据的基本信息&#xff08;如形状、数据类型等&#xff09;2.2 数据清洗…

数据库(MySQL)—— 事务

数据库&#xff08;MySQL&#xff09;—— 事务 什么是事务事务操作未控制事务测试异常情况 控制事务一查看/设置事务提交方式&#xff1a;提交事务回滚事务 控制事务二开启事务提交事务回滚事务 并发事务问题脏读&#xff08;Dirty Read&#xff09;不可重复读&#xff08;Non…

使用scDblFinder()遇到的问题

问题&#xff1a;Error in (function (A, nv 5, nu nv, maxit 1000, work nv 7, reorth TRUE, : function ‘as_cholmod_sparse’ not provided by package ‘Matrix’ 使用scDblFinder() 筛选双细胞时&#xff0c;如果不想更换Matrix版本&#xff0c;首先重装“irlba”…

Web3钱包开发获取测试币-OKB X1Testnet(三)

Web3钱包开发获取测试币-OKB X1Testnet(三) 基于以上两篇 Web3钱包开发获取测试币-Polygon Mumbai(一) &#xff1a;https://suwu150.blog.csdn.net/article/details/137949473Web3钱包开发获取测试币-Base Sepolia(二)&#xff1a;https://suwu150.blog.csdn.net/article/det…

MySQL ORDER BY实例及性能优化分析

MySQL ORDER BY简介 当使用SELECT语句从表中查询数据时&#xff0c;结果集不会按任何顺序排序。要对结果集排序&#xff0c;请使用ORDER BY 子句。ORDER BY 子句允许您&#xff1a; 按单列或多列对结果集排序。按升序或降序对不同列进行结果集排序。 下面介绍了ORDER BY子句…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):2.1神经元与大脑

目录 神经网络1.初始动机*2.发展历史3.深度学习*4.应用历程 生物神经元1.基本功能2.神经元的互动方式3.信号传递与思维形成4.神经网络的形成 生物神经元简化1.生物神经元的结构2.信号传递过程3.生物学术语与人工神经网络 人工神经元*1.模型简化2.人工神经网络的构建3.计算和输入…

uniapp 微信开发工具上访问正常,真机调试一直跨域报错

微信小程序真机调试时&#xff0c;出现跨域问题&#xff0c;需要同时在后端设置多种允许跨域的设置&#xff1a; // 指定允许其他域名访问 header(Access-Control-Allow-Origin:*); // 响应类型 header(Access-Control-Allow-Methods:GET,POST,OPTION); // 响应头设置 header(…

vue3+vite+js axios引用

先交代下基础版本&#xff1a; “node”&#xff1a;“V16.14.1” “vue”: “^3.4.21” “vite”: “^5.2.0” 安装&#xff1a;npm install axios --save在src目录下的utils文件夹创建一个request.js文件&#xff08;示例代码&#xff0c;仅供参考&#xff09;: //引入axio…