当前位置: 首页 > news >正文

MyBatisPlus(二十一)乐观锁

使用场景

用于当有多个用户同时修改同一条数据的时候,只允许有一个修改成功。

实现原理

使用一个字段,用于记录数据的版本。
当修改数据时,会去检测当前版本是否是正在修改的版本,同时修改成功后会把 版本号 + 1

实现方式

  1. 配置插件
  2. 在实体类的字段上加上@Version注解

在这里插入图片描述

代码

配置插件

package com.example.core.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@MapperScan("com.example.web")
public class MybatisPlusConfig {/*** 添加拦截器*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁插件interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); // 针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 如果配置多个插件,切记分页最后添加// interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;}
}

在实体类的字段上加上@Version注解

package com.example.web.entity;import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;@Datapublic class User {// 其他字段/*** 版本*/@Versionprivate Integer version;
}

数据库表

在这里插入图片描述

测试

代码

    /*** 插入用户*/@Testpublic void insert() {User user = new User();user.setId(16L);user.setName("郑一");user.setAge(30);user.setEmail("zhengyi@example.com");user.setGender(GenderEnum.MALE);mapper.insert(user);}/*** 更新用户:版本号为空,乐观锁失效。*/@Testpublic void update() {User user = new User();user.setId(16L);user.setAge(31);mapper.updateById(user);}/*** 更新用户:版本号 +1(版本号不为空,乐观锁有效)。*/@Testpublic void updateWithVersion() {User user = mapper.selectById(16L);user.setAge(31);mapper.updateById(user);}/*** 更新用户:测试同时更新,第二个更新失败。*/@Testpublic void updateConcurrent() {// 同步查询User user1 = mapper.selectById(16L);user1.setAge(32);User user2 = mapper.selectById(16L);user2.setAge(33);// 更新mapper.updateById(user1);mapper.updateById(user2);}

新插入的数据

在这里插入图片描述

更新时版本号为空,乐观锁失效

感觉这像是一个漏洞。
在这里插入图片描述

更新时版本号不为空,乐观锁有效

当 实体 的 version 字段不为空时,乐观锁才能正常生效。
在这里插入图片描述

模拟同时更新

同一条数据,查询两次出来。然后调用两次更新,第一次更新成功,第二次更新失败。

查询两次数据

在这里插入图片描述

两次更新,第一次成功了,Updates: 1;第二次失败了,Updates: 0

在这里插入图片描述

相关文章:

MyBatisPlus(二十一)乐观锁

使用场景 用于当有多个用户同时修改同一条数据的时候,只允许有一个修改成功。 实现原理 使用一个字段,用于记录数据的版本。 当修改数据时,会去检测当前版本是否是正在修改的版本,同时修改成功后会把 版本号 1。 实现方式 配…...

node 通过axios发送post请求(FormData)

方案一: const axios require(axios) const FormData require(form-data) const fs require(fs)const sdUpscaleOnAzure async (req, res) > {const data new FormData()data.append(image, fs.readFileSync(/temp/ai/sd/download/1.png))let config {hea…...

2024 王道考研-数据结构

第二章 线性表算法题(线性表的顺序表示) 二、综合应用题 01.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位 置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。 算法思想:搜索整个顺序表&#xf…...

【疯狂Java讲义】Java学习记录(使用jar命令打包)

jar命令 把多个文件打包成一个压缩包——这个压缩包和WinZip的压缩格式是一样的。 区别在于jar压缩的文件默认多一个META-INF的文件夹,该文件夹里包含一个MANIFEST.MF的文件(清单)。 通常来说,得到的压缩包有3种(压缩格…...

数据库第一、二章作业

只为记录与分享 第1,2章作业.xls 题量: 34 满分: 100 一. 单选题(共34题) 1. (单选题)在数据库中,下列说法( )是不正确的。 A. 数据库避免了一切数据的重复B. 若系统是完全可以控制的,则系统可确保更新…...

将数组拆分成斐波那契序列

题目描述 示例 代码如下&#xff1a; public class SplitIntoFibonacci {LinkedList<Integer> res new LinkedList<>();public List<Integer> splitIntoFibonacci(String num) {if(num.length() < 3) return res;if(dfs(num, 0)) return res;return new…...

【Linux】:权限

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…...

8年软件测试工程师感悟——写给还在迷茫中的朋友

这两天和朋友谈到软件测试的发展&#xff0c;其实软件测试已经在不知不觉中发生了非常大的改变&#xff0c;前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。当然&a…...

CleanMyMac苹果电脑清理软件是智商税吗?最全评测价格、清理效果一次说清

这是一篇CleanMyMac最全评测&#xff01;价格、清理效果一次说清&#xff0c;告诉你它真不是智商税! 升级Ventura系统之前&#xff0c;我用的是CleanMyMac X绿色版&#xff08;绝不提倡这个行为&#xff09;。更新到Ventura之后&#xff0c;之前很多绿色软件失效&#xff0c;浪…...

【pytorch 中 torch.max 和 torch.argmax 的区别】

torch.max 和 torch.argmax 的区别 1.torch.max torch.max(input, dim, maxNone, max_indicesNone, keepdimFalse) -->> (Tensor, LongTensor) 作用&#xff1a;找出给定tensor的指定维度dim上的上的最大值&#xff0c;并返回最大值在该维度上的值和位置索引。 应用举…...

无效的 page.json [“window“] 页面.json配置了“window“: {“disableScroll“: true}

问题&#xff1a;启动小程序时报错 无效的 page.json ["window"] 页面 解决&#xff1a; app.json 全局配置才使用window对象&#xff0c;在单独的页面直接写disableScroll:true即可 //app.json中添加&#xff0c;window里面添加就可以了 "window": { …...

2023最新短视频配音软件~

随着互联网的迅猛发展&#xff0c;网络平台上的影视剧配音逐渐成为一种热门赚钱方式。那么&#xff0c;想要参与影视剧配音赚钱&#xff0c;就需要拥有一款好用的配音软件。下面我就为大家介绍一款最新的影视剧配音神器&#xff01; 悦音配音 这是一款大家都在用的配音工具&am…...

【内网击穿工具 】NATAPP

内网穿透又叫内网映射&#xff0c;功能是把内网IP映射到公网&#xff0c;使公网也能轻松访问所搭建的服务。 内网与外网 外网指的是一个组织或网络中可公开访问的网络&#xff0c;即对外开放的网络。外网可以通过公共互联网进行访问 内网是相对于外网而言的&#xff0c;指的…...

vue 使用crypto.js解密后,用JSON.parse转义报错非空白格解决办法

问题&#xff1a; 用JSON.parse转义crypto解密后的json字符串会发生错误。如图&#xff1a; 原因&#xff1a; 那是因为crypto自己加了一些未可见的字符&#xff0c;所以用正常的JSON.parse(xxxx)会报错。 解决办法&#xff1a; JSON.parse(xxxx.replace(/[\u0000-\u001F\u…...

全景分割的自监督学习

在本章中,我们将第3章中讨论的SSL方法扩展到语义和全景分割任务。使用手动生成的标签训练的卷积神经网络通常用于语义或实例分割。 在精准农业中,自动化花朵检测方法使用监督模型和后处理技术,随着花朵的外观和数据采集条件的变化,这些技术可能无法始终如一地执行。我们提…...

基于python的23种设计模式

以下是基于Python实现的23种设计模式及代码段和详细解释&#xff1a; 1. 工厂模式&#xff08;Factory Pattern&#xff09; 简介 工厂模式是一种创建型设计模式&#xff0c;它允许客户端代码通过工厂方法创建对象&#xff0c;而无需直接实例化对象。在工厂方法模式中&#…...

屏幕录制视频编辑软件 Camtasia 2023 mac中文版软件功能

Camtasia 2023 mac是一款功能强大的屏幕录制和视频编辑软件&#xff0c;可以用于制作教育课程、演示文稿、培训视频等。它具有一系列工具和功能&#xff0c;包括屏幕录制、视频编辑、音频编辑、字幕、特效等&#xff0c;使用户可以轻松地创建高质量的视频内容。 Camtasia2023的…...

关于spring的xml文件中的xmlns,xsi,schemaLocation

关于spring xml文件中的xmlns,xsi:schemaLocation 首先我们看到的一个spring的配置文件大概如下面这个样子&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans" //这表…...

mac-“准备安装时发生错误,请尝试重新运行此应用程序” + mac未能安装所需的固件更新

参考链接&#xff1a;参考 u盘安装时候遇到问题&#xff1a; 安装系统时候报错 解决方案&#xff1a; 根据u盘系统上进行格式化磁盘&#xff0c;&#xff08;我选择的是APFS&#xff09;&#xff0c;命名Macintosh HD 抹完之后选择急救下。 然后退出磁盘工具&#xff0c;点击…...

二叉搜索树的详解及Map和Set的介绍

目录 1.二叉搜索树 1.1二叉搜索树的介绍 1.2.二叉搜索树的实现 1.2.1二叉搜索树的创建 1.2.2查找关键字 1.2.3插入 1.2.4删除 1.3二叉搜索树的性能分析 2.Map Map官方文档 2.1Map 的常用方法说明 2.2关于Map.Entry的说明,> 2.3注意事项 2.4reeMap和HashMap的区别 …...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...