SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo)

乐观锁加注解@Version后不需要手动进行加1操作。乐观锁是一种用于解决并发冲突的机制,在数据库中用于保护数据的一致性。@Version注解是MyBatisPlus框架中的乐观锁注解,它会在更新数据时自动检查版本号是否一致,如果一致则进行更新操作,如果不一致则表示数据已被其他线程修改过,更新操作会失败。

@Version注解会自动对版本号进行加1操作,所以在使用乐观锁时不需要手动进行加1操作。当进行更新操作时,MyBatisPlus会自动更新版本号,并将更新后的版本号与更新条件一起发送给数据库,如果版本号在更新过程中发生变化,则说明数据已被其他线程修改,更新操作会失败。

因此,使用乐观锁加注解@Version后,可以简化代码,并且可以保证数据的一致性

使用场景: 当要更新一条数据时,希望这条数据没有被别人更新,也就是说实现线程安全的数据更新

1. 数据库新增version字段, int类型, 默认值为0

2. 引入依赖
<!--MyBatisPlus 拦截器-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.5.1</version>
</dependency>

3. springboot启动类中新增bean

    /**
     * 支持拦截器乐观锁
     *
     * @return
     */
    @Bean
    public MybatisPlusInterceptor optimisticLockerInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
 

4. 实体类 version字段贴上注解 @Version

@Version
private Long version;

5. sql更新语句 (@Version注解会自动对版本号进行加1操作,所以在使用乐观锁时不需要手动进行加1操作)
// 没加@Version注解sql
update wx_dept set name=#{name}, sn=#{sn}, version=#{version}+1 where id=#{id} and version=#{version}



// 加了@Version注解sql
update wx_dept set name=#{name}, sn=#{sn}, version=#{version} where id=#{id} and version=#{version}

6. service (乐观锁操作步骤: 每次操作前都是先查询、替换、最后更新, 否则乐观锁无效)
    /**
     * 修改部门
     * 
     * @param wxDept 部门
     * @return 结果
     */
    @Override
    public AjaxResult updateWxDept(WxDept wxDept) {


        // 乐观锁操作步骤: 每次操作前都是先查询、替换、最后更新, 否则乐观锁无效

        // 1. 先查询
        WxDept dept = wxDeptMapper.selectWxDeptById(wxDept.getId());
        log.info("查询出来的数据: {}", dept);
        // 2. 替换
        dept.setName("小卖铺");
        dept.setSn("sell");
        // 3. 最后更新
        int i = wxDeptMapper.updateWxDept(dept);
        if (i > 0) {
            return AjaxResult.success("乐观锁更新成功");
        } else {
            return AjaxResult.error("乐观锁更新失败");
        }
    }

7. 测试
7.1 查询出id是1的数据, 并修改数据 name=小卖铺, sn=sell

查询出来的数据: com.ruoyi.ruoyiwx.dept.domain.WxDept@861f795[
  id=1
  name=开发部
  sn=dev
  version=0
]

7.2   假设7.1还没更新时, 就有其它线程修改了id为1的数据, 版本号version=1

7.3   上面7.1执行update更新时就会失败, 因为版本号version=1, 不是刚查询出来的version=0 

{
    "msg": "乐观锁更新失败",
    "code": 500
}
总结: 
1. 每次去拿数据的时候都会认为别人不会修改数据, 所以不会上锁
2. 但是在更新的时候会判断在此期间有没有人去更新过这个数据, 可以使用版本号version

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse(二十一):Clickhouse SQL DDL操作-临时表及视图

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

Python功能制作之简单的3D特效

需要导入的库&#xff1a; pygame: 这是一个游戏开发库&#xff0c;用于创建多媒体应用程序&#xff0c;提供了处理图形、声音和输入的功能。 from pygame.locals import *: 导入pygame库中的常量和函数&#xff0c;用于处理事件和输入。 OpenGL.GL: 这是OpenGL的Python绑定…

奥威BI数据可视化工具:360度呈现数据,告别枯燥表格

随着企业数据量的不断增加&#xff0c;如何有效地进行数据分析与决策变得越来越重要。奥威BI数据可视化工具作为一款强大的数据分析工具&#xff0c;在帮助企业深入挖掘数据价值方面具有显著优势。 奥威BI数据可视化工具是一款基于数据仓库技术的数据分析工具&#xff0c;具有…

07-微信小程序-注册页面-模块化

07-微信小程序-注册页面 文章目录 注册页面使用 Page 构造器注册页面参数Object初始数据案例代码 生命周期回调函数组件事件处理函数setData()案例代码 生命周期模块化 注册页面 对于小程序中的每个页面&#xff0c;都需要在页面对应的 js 文件中进行注册&#xff0c;指定页面…

Leetcode-每日一题【剑指 Offer 34. 二叉树中和为某一值的路径】

题目 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22输…

Newsprk Newspaper新闻报纸WordPress主题

Newsprk Newspaper新闻报纸WordPress主题对于任何使用 WordPress 技术构建的新闻和杂志网站来说都是一个有吸引力且时尚的主题。Newsprk – 报纸 WordPress 主题非常适合任何新闻/杂志或与以下类别匹配的任何特定业务&#xff0c;如博客、体育、时尚、科学、足球、政治、视频、…

利用Jackson封装常用的JsonUtil工具类

在实际开发中&#xff0c;我们对于 JSON 数据的处理&#xff0c;通常有这么几个第三方工具包可以使用&#xff1a; gson&#xff1a;谷歌的fastjson&#xff1a;阿里巴巴的jackson&#xff1a;美国FasterXML公司的&#xff0c;Spring框架默认用的 由于以前一直用习惯了阿里的…

多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测

多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测&#xff1b; 2.运行环境为Matlab20…

无涯教程-PHP - sql_regcase()函数

sql_regcase() - 语法 string sql_regcase (string string) 可以将sql_regcase()函数视为实用程序函数&#xff0c;它将输入参数字符串中的每个字符转换为包含两个字符的带括号的表达式。 sql_regcase() - 返回值 返回带括号的表达式字符串以及转换后的字符。 sql_regcase…

8月17日上课内容 第三章 LVS+Keepalived群集

本章结构 Keepalived概述 keepalived 概述 1.服务功能 故障自动切换 健康检查 节点服务器高可用 HA keepalived工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题 在一个LVS服务集群中通常有主服务器 (MAST…

【Linux】网络层协议:IP

我们必须接受批评&#xff0c;因为它可以帮助我们走出自恋的幻象&#xff0c;不至于长久在道德和智识上自我陶醉&#xff0c;在自恋中走向毁灭&#xff0c;事实上我们远比自己想象的更伪善和幽暗。 文章目录 一、IP和TCP之间的关系&#xff08;提供策略 和 提供能力&#xff09…

【高危】Apache Airflow Spark Provider 任意文件读取漏洞 (CVE-2023-40272)

漏洞描述 Apache Airflow Spark Provider是Apache Airflow项目的一个插件&#xff0c;用于在Airflow中管理和调度Apache Spark作业。 受影响版本中&#xff0c;在JDBC连接时&#xff0c;由于没有对conn_prefix参数做验证&#xff0c;允许输入"?"来指定参数。攻击者…

k8s简介、虚拟机快速搭建k8s集群、集群管理方式及K8S工作原理和组件介绍

文章目录 1、k8s简介1.1、部署方式的变迁1.2、定义1.3、Kubernetes提供的功能 2、虚拟机快速搭建k8s集群2.1、虚拟机配置&#xff08;centos7 2G内存2个处理器&#xff09;2.2、基础环境准备2.3、docker安装&#xff08;易踩坑&#xff09;2.4、安装k8s组件2.5、master节点部署…

okhttp源码简单流程分析

拦截器详细解析可以看大佬简书 "https://www.jianshu.com/p/6fac73f7570f"和 “https://www.jianshu.com/p/3c740829475c” okhttp请求流程 1&#xff1a;OkHttpClient okHttpClient new OkHttpClient.Builder() 构建一个okhttpClient对象&#xff0c;传入你想传入的…

ThinkPHP6.0+ 使用Redis 原始用法

composer 安装 predis/predis 依赖&#xff0c;或者安装php_redis.dll的扩展。 我这里选择的是predis/predis 依赖。 composer require predis/predis 进入config/cache.php 配置添加redis缓存支持 示例&#xff1a; <?php// -----------------------------------------…

【学习笔记之java】使用RestTemplate调用第三方接口

1.首先需要导入依赖 <!-- RestTemplate使用导入的依赖--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>2.跟启动类同级创建…

【Linux操作系统】深入探索Linux系统编程中的信号集操作函数

在Linux系统编程中&#xff0c;信号集操作函数是非常重要的工具&#xff0c;它们允许我们对信号进行管理和控制。本篇博客将详细介绍Linux系统编程中的信号集操作函数&#xff0c;包括信号集的创建、添加和删除信号&#xff0c;以及对信号集进行操作的常用函数。通过深入了解这…

拒绝摆烂!C语言练习打卡第五天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…

〔015〕Stable Diffusion 之 模型管理和信息管理插件 篇

✨ 目录 &#x1f388; 模型管理&#x1f388; 添加预览图&#x1f388; 添加详细描述&#x1f388; 模型分组&#x1f388; 下载 Civitai Helper 插件&#x1f388; 插件 Civitai Helper 使用方法 &#x1f388; 模型管理 点击生成按钮下的 显示/隐藏扩展模型 Show/hide extr…

非常好用的Python单行代码详解

概要 有用的 Python 单行代码片段&#xff0c;只需一行代码即可解决特定编码问题&#xff01;在本文中&#xff0c;将分享20 个 Python 一行代码&#xff0c;你可以在 30 秒或更短的时间内轻松学习它们。这种单行代码将节省你的时间&#xff0c;并使你的代码看起来更干净且易于…