分布式锁之-mysql

news2024/11/25 13:08:58

使用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
    @Override
    public 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_stock
        set stock   = stock - 1,
            version = version + 1
        where id = #{id}
          and version = #{version}
    </update>

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

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

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

相关文章

Redis如何避免数据丢失?——AOF

目录 AOF日志 1. 持久化——命令写入到AOF文件 写到用户缓冲区 AOF的触发入口函数——propagate 具体的实现逻辑——feedAppendOnlyFile 从用户缓冲区写入到AOF文件(磁盘&#xff09; 函数write、fsync、fdatasync Redis的线程池 AOF文件的同步策略 触发的入口函数——…

懒洋洋作业讲解

懒洋洋作业讲解 环境配置 1.软件下载&#xff1a;DCloud - HBuilder、HBuilderX、uni-app、uniapp、5、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架 2.软件介绍 HBuilder是由DCloud&#xff08;数字天堂&#xff09;推出的一款面向HTML5的Web开发…

Apple OpenELM设备端语言模型

Apple 发布的 OpenELM&#xff08;一系列专为高效设备上处理而设计的开源语言模型&#xff09;引发了相当大的争论。一方面&#xff0c;苹果在开源协作和设备端AI处理方面迈出了一步&#xff0c;强调隐私和效率。另一方面&#xff0c;与微软 Phi-3 Mini 等竞争对手相比&#xf…

Leetcode—724. 寻找数组的中心下标【简单】

2024每日刷题&#xff08;129&#xff09; Leetcode—724. 寻找数组的中心下标 实现代码 class Solution { public:int pivotIndex(vector<int>& nums) {int sum accumulate(nums.begin(), nums.end(), 0);int prefix 0;for(int i 0; i < nums.size(); i) {i…

软件开发的 20 条基本原则:LoD、SoC、SOLID 等

Introduction 介绍 Software design principles are the foundation of software development. As a software engineer, you can find them in your work tools, languages, frameworks, paradigms, and patterns. They are the core pillars of “good” and “readable” co…

各行业预约上门服务小程序源码系统 在线提交表单+自主接单 带完整的安装代码包以及搭建教程

在当今数字化快速发展的时代&#xff0c;传统行业纷纷寻求与互联网的结合&#xff0c;以提升服务效率和用户体验。为了满足这一需求&#xff0c;罗峰给大家分享一款针对各行业预约上门服务的小程序源码系统。该系统集在线提交表单、自主接单等功能于一体&#xff0c;并附带完整…

揭秘依赖注入:软件开发人员的基本指南

Dependency injection (DI) is a design pattern and programming technique to manage dependencies between different components. 依赖注入&#xff08;DI&#xff09;是一种用于管理不同组件之间依赖关系的设计模式和编程技术。 In DI, the dependencies of a class or ot…

厚德提问大佬答3:让AI绘画更有效率

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…

深入分析网络智能摄像头的RTSP协议安全风险

本文为转载&#xff0c;原作者&#xff1a;山石网科安全技术研究院 网络摄像头作为现代安防体系的关键组成部分&#xff0c;已经广泛应用于各类场所&#xff0c;包括交通枢纽、教育机构、企业办公区、零售商场等公共和私人领域。它们主要负责提供实时视频监控&#xff0c;以加…

责任链模式和观察者模式

1、责任链模式 1.1 概述 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经理、总经理等&#xff0c;但每个领导…

【微积分听课笔记】全微分,二元极值,Double Integral

6.6 二元函数的极值_哔哩哔哩_bilibili 此笔记为听课笔记&#xff0c;宋浩老师微积分~ 最近诸事缠身&#xff0c;会有种会不会只做一件事好些。实际上&#xff0c;关键在于动力&#xff0c;我不可能每次都准备充分。动力&#xff0c;分配&#xff0c;这是目前进入大学我正在学…

用户至上!探索7种常用的用户体验研究方法

用户体验研究是产品开放过程中的重要组成部分&#xff0c;优秀的产品设计与高质量的用户体验是不可分割的。对于产品开发&#xff0c;选择合适的用户体验研究方法在很大程度上决定了产品的使用效果。本文全面阐述了用户体验研究、用户体验研究的重要性和用户体验研究方法&#…

138.随机链表的复制

/*** Definition for a Node.* struct Node {* int val;* struct Node *next;* struct Node *random;* };*/ typedef struct Node Node; struct Node* copyRandomList(struct Node* head) {Node* curhead;//拷贝节点插入到原节点后面while(cur){Node* copy(Node*)m…

产业项目招商活动会议课程报名签到h5小程序pc开源版开发

产业项目招商活动会议课程报名签到h5小程序pc开源版开发 一个集PC和移动端功能于一体的解决方案&#xff0c;线上线下进行服务&#xff0c;围绕 活动报名、在线课程、项目大厅、线下签到、会员系统等。为商会提供了更加便捷高效的管理方式&#xff0c;提升了商会活动和项目的组…

IaC实战指南:DevOps的自动化基石

基础设施即代码&#xff08;Infrastructure as Code&#xff0c;IaC&#xff09;是指利用脚本、配置或编程语言创建和维护基础设施的一组实践和流程。通过IaC&#xff0c;我们可以轻松测试各个组件、实现所需的功能并在最小化停机时间的前提下进行扩展。更值得一提的是&#xf…

学习通下载PDF资源

今天突然发现&#xff0c;学习通的pdf资源居然是没有下载入口的&#xff0c;这整的我想cv一下我的作业都搞不了&#xff0c;于是我一怒之下&#xff0c;怒了一下。 可以看到学习通的pdf资源是内嵌在网页的&#xff0c;阅读起来很不方便&#xff0c;虽然他内置了阅读器&#xf…

游泳耳机哪个牌子好性价比高?优选四大品质卓越品牌,诚挚推荐

随着科技的日新月异&#xff0c;游泳与音乐的融合已不再是遥不可及的梦想&#xff0c;一款性价比高的游泳耳机成为了许多游泳爱好者提升运动体验、激发运动热情的必备工具。可面对市场上种类繁多、价格各异的游泳耳机品牌&#xff0c;如何在确保高品质的同时&#xff0c;寻觅到…

使用antiSMASH数据库及软件分析微生物组

Introduction 上次简要介绍过了微生物组中生物合成基因簇&#xff08;BGCs&#xff09;分析&#xff0c;这次具体讲解使用antiSMASH数据库及软件分析的流程。 antiSMASH&#xff08;antibiotics & Secondary Metabolite Analysis Shell&#xff09;是一个用于识别和分析微…

解决“您的连接不是私密连接”

目录 那么为什么会出现这样提示呢 https访问有什么不同 将http访问更改为https访问 当您在浏览网页时&#xff0c;遇到“您的连接不是私密连接”的提示&#xff0c;这通常表示浏览器认为您的连接不够安全。这是因为浏览器无法信任网站使用的SSL证书&#xff0c;或者网站没有…

分布式光纤测温DTS的测温范围是多少?

分布式光纤测温DTS的测温范围不仅仅取决于光缆的感温能力&#xff0c;还受到多种复杂因素的影响。尽管高温光缆可以耐高温&#xff0c;低温光缆可以耐低温&#xff0c;甚至镀金光缆能够耐受高达700摄氏度的极高温度&#xff0c;然而&#xff0c;这些因素并不能完全解释测温范围…