SpringBoot + Mybatis-Plus中乐观锁实现

  • 悲观锁

    悲观锁是一种悲观思想,它认为数据很可能会被别人所修改

    所以总会对数据进行上锁,读操作和写操作都会上锁,性能较低,使用较少!

  • 乐观锁

    乐观锁是一种乐观思想,它认为数据并不一定会被别人所修改

    所以读操作不会上锁,但写操作时会先判断当前数据是否被修改过(一般采用版本号机制来实现 )  

乐观锁的实现方式:

  • 在表中添加一个 version 字段,表示数据的版本

  • 修改数据时首先判断自己当前拥有的 version 和数据库中的 version 是否一致

  • 如果一致,则修改数据,同时将 version 加 1,表示数据版本发生了变化

  • 如果不一致,则修改失败,表示数据被别人修改过。

步骤:

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

    @Version // 乐观锁注解
    private Integer version;
  2. 配置MybatisPlusConfig

    @Configuration
    @MapperScan("net.wanho.mapper")
    public class MyBatisPlusConfig {/*** 拦截器*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 分页插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 乐观锁插件interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}}
  3. 测试

    修改数据时执行的sql语句:UPDATE product SET name=?, price=?, version=? WHERE id=? AND version=?

    • 修改的条件中,对 version 做了判断,只有和当前拥有的 version 一致才进行修改

    • 修改的字段中,对 version 做了+1

  4. 判断是否修改失败

    如果修改失败,重新获取商品信息,再次修改

    if (result2 == 0) {// 5.小王修改失败,重新获取商品信息p2 = productMapper.selectById(1);// 6.小王将商品减了30元,存入了数据库p2.setPrice(p2.getPrice() - 30);result2 = productMapper.updateById(p2);System.out.println("小王修改结果:" + result2);
    }

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

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

相关文章

成为程序员后我都明白了什么?从入行到弃坑?

作为一个入行近10年的php程序员,真心感觉一切都才刚开始,对计算机,编程语言的理解也好,程序员中年危机也罢,之前都是听别人说的,真的自己到了这个水平,这个年龄才深刻体会到这其中的种种。 我一…

测试基础05:软件测试的分类

课程大纲 1、两种架构(Architecture) 1.1、B/S(Browser/Server) 浏览器服务器架构(大体3步):用户通过浏览器向服务器发出请求,服务器处理请求,将结果通过网络返回到用户…

使用Webcam实现摄像头的开启和关闭,并保存和复制图片

实现思路 0,将webcam的jar文件传入项目中 1,显示摄像头的地方:创建一个画板,在画板上添加开启和关闭按钮 2,设置开启和关闭功能:创建一个类实现动作监听器,进而实现监听动作按钮 3&#xff…

【数据结构与算法篇】二叉树链式结构及实现

【数据结构与算法篇】二叉树链式结构及实现 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 4. 二叉树链式结构的实现 4.1 前置说明 4.2 二叉树的遍历 4.2.1 前序、中序以及…

通过ssh在本地打开远程服务器的网页

用途 在远程服务器使用jupyter notebook或者tensorboard等时,在本地打开服务器端的网页的方式有很多比如可以使用MobaXterm工具等,此方法可参考https://blog.csdn.net/cc__cc__/article/details/108060618?spm1001.2014.3001.5502。 若直接使用ssh则可…

C++感受11-Hello Object 成员版

当一个C程序员在设计类型时,他在想什么? 这一类型的对象,需要拥有哪些属性数据?这一类型的对象,它将拥有哪些功能?这一类型的对象,它的各个属性和功能之间,有哪些关联关系&#xff1…

OceanBase的存储架构与传统LSM-Tree架构的异同|OceanBase数据转储合并技术解读(二)

前篇博文将OceanBase的存储架构巧妙地与自然界中的“水生态”进行了类比,今日我们转变视角,聚焦在与拥有相同LSM-Tree架构的其他产品的比较,深入探讨OceanBase相较于它们所展现出的独特性能。 众所周知,OceanBase数据库的存储引擎…

element-ui 前端ui框架用法开发指南(2024-05-22)

Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 1、npm安装 // npm安装:npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在线引入 访问最新版本的资源地址 - element-uiThe CDN for element-u…

RedHat9 | DNS剖析-配置主DNS服务器实例

一、实验环境 1、BIND软件包介绍 BIND软件是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护,全称为Berkeley Internet Name Domain。该软件在DNS(域名系统)领域具有重要地位,是目前世界上使用最…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集,使用 LabelMe 工具进行标注,然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件,并自动生成YOLOv8支持的目录结构,包括melon.yaml文件,其内容…

信息系统管理工程师问答题

信息系统管理工程师问答题 系统管理安全两方面 安全测试 入侵检测系统的功能 用户标识与验证常用的3种方法 (1) 要求用户输入一些保密信息,例如用户名称和密码; (2) 采用物理识别设备,例如访问卡、钥匙或令牌; (3) 采用生物统计学…

Python怎样定位并删除Sql语句中不确定的查询条件

1.问题场景描述: 在sql语句中经常会有查询条件是:查找多个订单签订日期范围的数据,但具体的日期范围是不确定,我们如何来查找定位 例如:查询条件语句的部分如下图: 目标是: 1)定位字符串:t_contract_order.sign_date 2)最终得到结果: 解决问题思路: 1)定位要找的字符串起始位置…

【学习心得】PyTorch的知识要点复习(持续更新)

PyTorch知识要点复习,目的是为了巩固PyTorch基础、快速回顾、深化理解PyTorch框架。这篇文章会持续更新。 一、本文的一些说明 知识点梳理:我将PyTorch的核心概念和高级技巧进行了系统化的整理,从基础的张量操作到复杂的模型构建与训练。这样…

【Linux】进程终止与进程等待

目录 进程终止 errno exit和_exit 进程等待 wait和waitpid 宏:WIFEXITED 非阻塞等待 进程终止 下面要谈的一个话题就是进程终止,就是说一个进程退出了,可能有三种情况 1.进程代码执行完,结果是正确的 2.进程代码执行完&…

【九十二】【算法分析与设计】875. 爱吃香蕉的珂珂,410. 分割数组的最大值,机器人跳跃问题,二分答案法

875. 爱吃香蕉的珂珂 - 力扣(LeetCode) 珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。 珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每…

【活动】开源与闭源大模型:探索未来趋势的双轨道路

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 开源与闭源大模型:探索未来趋势的双轨道路引言一、开源大模型&#…

翻译《The Old New Thing》- The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag

The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071128-00/?p24353 Raymond Chen 2007年11月28日 FORMAT_MESSAGE_IGNORE_INSERTS 标志的重要性 简要 文章讨论了使用FormatMes…

评估企业的业务是否存在高风险的六个步骤

风险的幽灵使得组织别无选择,只能改善各种网络风险的总体管理。以下是一个基于信息安全论坛的IRAM2方法论的分步过程,网络安全和风险从业者可以利用它来评估和管理信息风险。 第1步:范围界定练习 范围界定练习的目标是提供一个以业务为中心…

基于springboot+vue的招聘信息管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

K8s的常用命令以及yaml文件的创建

目录 一、声明式管理方法:YAML文件 1、yaml文件简介 2、yaml和json的主要区别: 3、YAML的语法格式 4、yaml文件组成部分 ①控制器定义 5、查看api资源版本标签 6、编写nginx-deployment.yaml资源配置清单 6.1创建资源对象 6.2查看创建的pod资源…