Mybatis-Plus实现乐观锁

1 悲观锁和乐观锁场景和介绍

乐观锁和悲观锁是在并发编程中用于处理并发访问和资源竞争的两种不同的锁机制!!

1.1 悲观锁:

悲观锁的基本思想是,在整个数据访问过程中,将共享资源锁定,以确保其他线程或进程不能同时访问和修改该资源。悲观锁的核心思想是"先保护,再修改"。在悲观锁的应用中,线程在访问共享资源之前会获取到锁,并在整个操作过程中保持锁的状态,阻塞其他线程的访问。只有当前线程完成操作后,才会释放锁,让其他线程继续操作资源。这种锁机制可以确保资源独占性和数据的一致性,但是在高并发环境下,悲观锁的效率相对较低。

1.2 乐观锁:

乐观锁的基本思想是,认为并发冲突的概率较低,因此不需要提前加锁,而是在数据更新阶段进行冲突检测和处理。乐观锁的核心思想是"先修改,后校验"。在乐观锁的应用中,线程在读取共享资源时不会加锁,而是记录特定的版本信息。当线程准备更新资源时,会先检查该资源的版本信息是否与之前读取的版本信息一致,如果一致则执行更新操作,否则说明有其他线程修改了该资源,需要进行相应的冲突处理。乐观锁通过避免加锁操作,提高了系统的并发性能和吞吐量,但是在并发冲突较为频繁的情况下,乐观锁会导致较多的冲突处理和重试操作。

理解点: 悲观锁和乐观锁是两种解决并发数据问题的思路,不是具体技术!!!

1.3 具体技术和方案:

  1. 乐观锁实现方案和技术:
    • 版本号/时间戳:为数据添加一个版本号或时间戳字段,每次更新数据时,比较当前版本号或时间戳与期望值是否一致,若一致则更新成功,否则表示数据已被修改,需要进行冲突处理。
    • CAS(Compare-and-Swap):使用原子操作比较当前值与旧值是否一致,若一致则进行更新操作,否则重新尝试。
    • 无锁数据结构:采用无锁数据结构,如无锁队列、无锁哈希表等,通过使用原子操作实现并发安全。
  2. 悲观锁实现方案和技术:
    • 锁机制:使用传统的锁机制,如互斥锁(Mutex Lock)或读写锁(Read-Write Lock)来保证对共享资源的独占访问。
    • 数据库锁:在数据库层面使用行级锁或表级锁来控制并发访问。
    • 信号量(Semaphore):使用信号量来限制对资源的并发访问。

2. 乐观锁实现

2.1 版本号乐观锁技术的实现流程:

  • 每条数据添加一个版本号字段version
  • 取出记录时,获取当前 version
  • 更新时,检查获取版本号是不是数据库当前最新版本号
  • 如果是[证明没有人修改数据], 执行更新, set 数据更新 , version = version+ 1
  • 如果 version 不对[证明有人已经修改了],我们现在的其他记录就是失效数据!就更新失败

2.2 使用mybatis-plus数据使用乐观锁

  • 添加版本号更新插件

    	@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}
    
  • 乐观锁字段添加@Version注解

    注意: 数据库也需要添加version字段

    ALTER TABLE USER ADD VERSION INT DEFAULT 1 ;  # int 类型 乐观锁字段
    
    • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
    • 仅支持 updateById(id)update(entity, wrapper) 方法
    @Version
    private Integer version;
    

2.3 测试

//演示乐观锁生效场景
@Test
public void testQuick7(){//步骤1: 先查询,在更新 获取version数据//同时查询两条,但是version唯一,最后更新的失败User user  = userMapper.selectById(5);User user1  = userMapper.selectById(5);user.setAge(20);user1.setAge(30);userMapper.updateById(user);//乐观锁生效,失败!userMapper.updateById(user1);
}

上述案例的操作流程为:

  • user和user1都先进行查询操作,这一步也获取到了version
  • user对age进行了修改,此时数据库的version已经得到了更新
  • user1在随后的修改时会检查自己获得的version与目前数据库中的version是否一致。此时发现并不一致,因为user对数据库进行了修改。因此,user1的修改操作失败。

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

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

相关文章

Learn OpenGL 19 几何着色器

几何着色器 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方…

动态路由协议——OSPF

目录 一.OSPF来源 二.OSPF术语 1.area id——区域的划分 2.cost——路径开销值 3.route id 4.LSDB表 5.邻居表 6.OSPF路由表 三.OSPF工作过程 1.交互hello报文建立邻居关系 2.选举主从 3.交互LSDB摘要信息 4.LSR,LSU,LSACK同步LSDB表项 5.各自计算路由 四.OSPF交…

简单函数_学分绩点

任务描述 北京大学对本科生的成绩施行平均学分绩点制(GPA)。既将学生的实际考分根据不同的学科的不同学分按一定的公式进行计算。 公式如下: 实际成绩 绩点 90——100 4.0 85——89 3.7 82——84 3.3 78——81 3.0 75——77 …

redis【面试题】

目录 Java全技术栈面试题合集地址Redis篇1.Redis 的数据类型?2.Redis 是单进程单线程的?3.一个字符串类型的值能存储最大容量是多少?4.Redis 的持久化机制是什么?各自的优缺点?5.redis 过期键的删除策略?6.…

maven手动上传的第三方包 打包项目报错 Could not find xxx in central 解决办法

背景: 在Maven私服手动上传了第三方的jar包, 只有jar包, 没有pom文件, 项目在ide中可以正常编译启动,但打包报错无法找到jar包 解决办法: 上传jar包的时候, 点击生成pom. 则打包的时候不会报错

Python判断一个数是否为素数

在Python中&#xff0c;你可以编写一个函数来判断一个数是否为素数。素数是指只有1和它本身两个正因数&#xff08;不包括1本身&#xff09;的自然数。以下是一个简单的示例代码&#xff1a; python复制代码 def is_prime(n): if n < 1: return False if n < 3: return …

pyrealsense2获取保存点云

一、第一种实现代码 Python import sys import cv2 import pyrealsense2 as rs import numpy as np import keyboard import open3d as o3d import osif __name__ "__main__":output_folder output_data/os.makedirs(output_folder, exist_okTrue)pipeline rs.p…

三级数据库技术知识点(详解!!!)

1、从功能角度数据库应用系统可以划分为表示层、业务逻辑层、数据访问层、数据持久层四个层次&#xff0c;其中负责向表示层直接传送数据的是业务逻辑层。 【解析】表示层负责所有与用户交互的功能;业务逻辑层负责根据业务逻辑需要将表示层获取的数据进行组织后&#xff0c;传…

怎样保持SSH长时连接不断开(客户机)

怎样保持SSH连接不自动断开? 一、前言 远程访问服务器的时候&#xff0c;长时间不操作就会断开连接&#xff0c;这让我苦恼不已&#xff0c;因此花了不少时间折腾&#xff0c;因为我用过的很多方法都无效&#xff0c;经过几番测试&#xff0c;找到了一种解决方案。 不过我只…

阅读MySQL知识4

一、MySQL数据库主从同步延迟产生的原因 MySQL的主从复制都是单线程的操作&#xff0c;主库对所有DDL和DML产生的日志写进binlog&#xff0c;由于binlog是顺序写&#xff0c;所以效率很高。 Slave的SQL Thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作…

c# 结构体(Struct)与枚举(Enum)与记录(Record)

结构体(Struct) struct是值类型数据,存储在栈上,原来的值数据一般一般存储单一数据结构定义的数据是记录(存储的数据多). 类也可以存储大量数据,但是类是引用结构,存储在堆上.严谨来说,引用类型的值存储在堆上,引用类型的存储地址存储在栈上. struct的数据成员不能通过初始化器…

鸿蒙:PrefereneceUtil

1、初始化 在EntryAbility.ets中初始化 export default class EntryAbility extends UIAbility {async onCreate(want, launchParam) {// 1.加载用户首选项PreferenceUtil.loadPreference(this.context)hilog.info(0x0000, testTag, %{public}s, Ability onCreate);} } 2、使…

【Centos 轻松一键安装X11 Forwarding,实现无桌面版运行GUI】

#!/bin/bash# 更新系统包索引 echo "更新系统包索引..." sudo yum update -y# 安装X11相关的应用和认证工具 echo "安装X11相关的应用和认证工具..." sudo yum install -y xorg-x11-apps xorg-x11-xauth# 检查和修改/etc/ssh/sshd_config以允许X11转发 ech…

Java中过滤器和拦截器区别

1. 过滤器&#xff08;Filters&#xff09; 过滤器是Servlet规范中的一部分&#xff0c;它用于在请求进入Web应用程序时预处理请求&#xff0c;或在响应离开应用程序前进行处理。过滤器可以作用于请求内容、请求头、响应内容等。过滤器在Servlet容器中运行&#xff0c;并且与S…

Java集合面试题(一)

1. Java 中常用的容器有哪些&#xff1f; 在 Java 中&#xff0c;容器是一种特殊的数据结构&#xff0c;用于存储其他对象。它们可以帮助我们更高效地管理和操作大量的数据。以下是 Java 中常用的几种容器&#xff1a; List&#xff1a;有序集合&#xff08;也是动态数组&…

SpringBoot如何替换启动图标

SpringBoot项目在启动时会出现一个默认的启动图案 . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / /|_||___//_/_/_/::…

Qt:使用ctrl+z快捷键取消文本框修改

1、使用ctrlz快捷键取消文本框修改 #include <QApplication> #include <QLineEdit> #include <QUndoStack> #include <QVBoxLayout>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget window;QVBoxLayout layout(&window);/…

软件架构和基于架构的软件开发方法知识总结

一、软件架构定义 软件架构为软件系统提供了一个结构、行为和属性的高级抽象 软件架构是一种表达&#xff0c;使软件工程师能够&#xff1a; &#xff08;1&#xff09;分析设计在满足所规定的需求方面的有效性 &#xff08;2&#xff09;在设计变更相对容易的阶段&#xff0c;…

题目:异或森林(蓝桥OJ 3400)

问题描述&#xff1a; 解题思路&#xff1a; 一个数也可以看作是一段区间&#xff0c;当该区间的异或和为完全平方数时则符合题意。 我们需要注意枚举的完全平方的上限。 异或前缀和减小时间复杂度。 题解&#xff1a; #include <bits/stdc.h> using namespace std; usi…

vi\vim编辑器详解

vi\vim编辑器介绍 vi\vim是visual interface的简称, 是Linux中最经典的文本编辑器 同图形化界面中的 文本编辑器一样&#xff0c;vi是命令行下对文本文件进行编辑的绝佳选择。 vim 是 vi 的加强版本&#xff0c;兼容 vi 的所有指令&#xff0c;不仅能编辑文本&#xff0c;而…