MybatisPlus-乐观锁&悲观锁

2023-05-16

乐观锁:每次不加锁而是假设没有冲突而去完成某项操作,如果失败就重试,直到成功为止

悲观锁:synchronized是独占锁即悲观锁,会导致其他所有需要锁的线程挂起,等待有锁的线程释放锁

乐观锁实现方式:

  • 取出记录时,获取当前version

  • 更新时,带上这个version

  • 执行更新时,set version = newVersion where version = oldVersion

  • 如果version不对,就更新失败

    #乐观锁:先查询,获得版本号
    -- A
    update user set name = "wsk",version = version+1 
    where id = 1 and version = 1
    -- B  (B线程抢先完成,此时version=2,会导致A线程修改失败!)
    update user set name = "wsk",version = version+1 
    where id = 1 and version = 1
    

测试一下Mybatis-Plus乐观锁插件

1、给数据库中增加version字段

img

2、实体类加对应的字段

@Version//乐观锁version注解
private Integer version;

3、注册组件

//扫描mapper文件夹
@MapperScan("com.huang.mapper")//交给mybatis做的,可以让这个配置类做扫描,将主类注解删除
@EnableTransactionManagement//自动管理事务
@Configuration//配置类
public class MyBatisPlusConfig {
    //注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

4、测试

  • 成功
 //测试乐观锁成功
    public void  testOpimisticLocker(){

        //1、查询用户信息
        User user = userMapper.selectById(1L);
        //2、修改用户信息
        user.setAge(18);
        user.setEmail("1024955508@qq.com");
        //3、执行更新操作
        userMapper.updateById(user);
    }

img

  • 模拟多线程失败场景

    //测试乐观锁失败
        @Test//测试乐观锁失败  多线程下
        public void testOptimisticLocker2(){
            //线程1
            User user1 = userMapper.selectById(1L);
            user1.setName("乐观成功");
    
            //模拟另外一个线程执行了插队操作
            User user2 = userMapper.selectById(1L);
            user2.setName("插队");
    
            userMapper.updateById(user2);
            //自旋锁来多次尝试提交!
            userMapper.updateById(user1);//如果没有乐观锁就会覆盖插队线程的值
        }
    

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VY3ipH45-1634732079213)(MyBatisPlus.assets/I5%5BW9(T)]UQGXA%25RRNED%7D_UG.png](https://img-blog.csdnimg.cn/10cf577ec8f54ea1a04e9a558345a4e8.png))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MybatisPlus-乐观锁&悲观锁 的相关文章

随机推荐

  • gitee多人合作,上传push到别人的远程仓库

    首先要确保在别人的远程仓库中 第二步 xff1a 新建一个文件夹 xff0c 在里面点击右键 xff0c 选择 Git Bash Here进入操作界面 第三步 xff1a 先git init创建一个git文件 第四步 xff1a git r
  • 汽车CAN总线详解

    概述 CAN xff08 Controller Area Network xff09 总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线 xff0c 它起初用于实现汽车内ECU之间可靠的通信 xff0c 后因其简单实用可靠等
  • docker快速清理已停止的容器

    修剪所有不在运行的容器 xff0c 强制删除使用 f 或者 force docker container prune 使用 filter限制范围 xff0c 例如删除24小时前创建的已停止的容器 docker container prune
  • FreeRTOS学习笔记8(中断管理)

    1 中断管理的介绍 这里的中断管理主要是一些前面使用到的队列 信号量 互斥量等的在中断中使用的函数的封装 xff0c 为什么要从新封装这些函数 xff0c 这些函数有哪些优缺点 xff0c 这些函数是如何使用的 xff1f 这些问题后面会一
  • UCOSIII从官网(2021)下载

    官网地址 xff1a https www silabs com developers micrium 注意 xff1a 在进入下载前 可能 要注册一个账号 xff0c 如果可以直接下载的话不用注册也可以 xff0c 如果有小伙伴需要注册账号
  • dataX连接oracle报实例名错误

    oracleCDB数据库 xff1a 实例名CS 34 jdbcUrl 34 34 jdbc oracle thin 64 10 10 10 242 1521 xff1a CS 34 oraclePDB数据库 xff1a 实例名CS 34
  • 华清-周总结(2)(数据结构)

    数据结构类型 数据结构 xff1a 线性结构 xff0c 树形结构 xff0c 图形结构 线性结构 xff1a 在存储关系上 xff0c 每个元素最多有一个前驱 xff0c 一个后继 树形结构 xff1a 在存储关系上 xff0c 每个元素
  • 树莓派+新型混合无人机

    树莓派 43 新型混合无人机 产品设计缘由产品设计工作过程 xff1a 功能及成本预算 总结与鸣谢 产品设计缘由 我去设计这个树莓派 43 的一个产品 xff0c 是因为10月7日学校的创客训练营的招新选拔 xff0c 而选拔的题目是 xf
  • 树莓派frp内网穿透

    树莓派 43 frp内网穿透 一 frp二 frp作用三 安装与配置1 服务器端2 客户端 xff08 树莓派 xff09 一 frp frp 是一个高性能的反向代理应用 xff0c 支持 tcp udp http https 协议 二 f
  • FreeRTOS任务创建

    任务创建 操作 一 硬件初始化 span class token keyword static span span class token keyword void span span class token function Hardwa
  • vue2的点击事件简单搜索案例

    前端小白新人一枚 有不对请指正哦 写这篇文章的原因 xff1a 1 我使用了 computed 和 watch分别实现对列表的过滤筛选 xff0c 发现这两个方法均是用户输入自动过滤 xff0c 于是我想使用 点击事件过滤 xff0c 以下
  • QML嵌入视频遇到的一些问题汇总

    首先放上demo import QtQuick 2 6 import QtQuick Window 2 2 import QtMultimedia 5 8 Window visible true width 640 height 480 t
  • Downie 4 4.6.16 MAC上最新最好用的一款视频下载工具

    Downie for Mac 简介 Downie是Mac下一个简单的下载管理器 xff0c 可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们 Downie 4 下载 Downie 4 for Ma
  • AIGPT中文版(无需魔法,直接使用)不愧是生活工作的好帮手。

    AIGPT AIGPT是一款非常强大的人工智能技术的语言处理工具软件 xff0c 它具有 AI绘画 功能 AI写作 写论文 写代码 哲学探讨 创作等功能 xff0c 可以说是生活和工作中的好帮手 我们都知道使用ChatGPT是需要账号以及使
  • Tomcat10版本避坑

    Tomcat版本选择 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器 xff0c 属于轻量级应用服务器 xff0c 在中小型系统和 并发访问用户不是很多的场合下被普遍使用 xff0c 是开发和调试JSP 程序的首选 并且To
  • 阿里云ECS服务器ubuntu18图形界面安装

    文章目录 前言一 配置阿里镜像源二 安装图形界面三 VNC远程连接总结 前言 文章中的图形界面基于阿里云ECS服务器远程连接中的VNC连接 xff0c 使用时会体验到明显的延迟 xff0c 介意可以使用Xshell 43 Xmanger 4
  • 实验二 HDFS实验操作

    一 实验目的 理解HDFS在Hadoop体系结构中的角色熟练使用HDFS操作常用的Shell命令熟悉HDFS操作常用的Java API 二 实验平台 操作系统 xff1a ubuntu18Hadoop版本 xff1a 3 2 2JDK版本
  • Java程序部署到Linux环境上运行

    文章目录 前言一 Java环境安装二 Eclipse编译java程序并导出jar包三 Linux环境上运行jar包 前言 想要在Linux上运行java程序 xff0c 可以将java程序编译成功后导出成jar包 xff0c 然后在Linu
  • python疫情大数据可视化

    一 实验目的 通过本次实验掌握数据获取 数据清洗与存储和数据可视化工具的基本使用方法 二 实验平台 操作系统 xff1a window10 python版本 xff1a 3 8 IDE xff1a pycharm 可视化工具 xff1a e
  • MybatisPlus-乐观锁&悲观锁

    乐观锁 xff1a 每次不加锁而是假设没有冲突而去完成某项操作 xff0c 如果失败就重试 xff0c 直到成功为止 悲观锁 xff1a synchronized是独占锁即悲观锁 xff0c 会导致其他所有需要锁的线程挂起 xff0c 等待