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

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);
    }

相关文章:

SpringBoot + Mybatis-Plus中乐观锁实现

悲观锁 悲观锁是一种悲观思想,它认为数据很可能会被别人所修改 所以总会对数据进行上锁,读操作和写操作都会上锁,性能较低,使用较少! 乐观锁 乐观锁是一种乐观思想,它认为数据并不一定会被别人所修改 所以…...

设计模式深度解析:分布式与中心化,IT界两大巨头“华山论剑”

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨IT界的两大巨头交锋✨ 👋 在IT界的广阔天地中,有两座…...

转行一年了

关注、星标公众号,直达精彩内容 ID:技术让梦想更伟大 整理:李肖遥 来公司一年了。 说是转行其实还是在半导体行业,熟悉我的朋友知道 ,我在18年开始进入半导体行业,那个时候想着行业很重要,站对了…...

【LeetCode 151】反转字符串中的单词

1. 题目 2. 分析 这题要是用Python写,就非常简单了。 3. 代码 class Solution:def reverseWords(self, s: str) -> str:s " ".join(reversed(s.strip().split()))return s...

Behind the Code:Polkadot 如何重塑 Web3 未来

2024 年 5 月 17 日 Polkadot 生态 Behind the Code 第二季第一集 《创造 Web3 的未来》正式上线。第一集深入探讨了 Polkadot 和 Web3 技术在解决数字身份、数据所有权和去中心化治理方面的巨大潜力。 🔍 查看完整视频: https://youtu.be/_gP-M5nUidc?…...

for循环里如果std::pair的类型写不对,可能会造成性能损失

第一版 std::map<int, int> t;t.emplace(1, 1);for (const std::pair<int,int>& data : t){int i 0;std::ignore i;}中间留一些空格&#xff0c;是因为ms在调试的时候&#xff0c;尤其是模板比较多的时候&#xff0c;经常断点的行号有问题。比如第5行的断点&…...

【Linux】Linux的基本指令_2

文章目录 二、基本指令8. man9. nano 和 cat10. cp11. mv12. echo 和 > 和 >> 和 <13. more 和 less14. head 和 tail 和 | 未完待续 二、基本指令 8. man Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助。访问…...

Effective C++(3)

3.资源管理 条款13&#xff1a;以对象管理资源 以对象管理资源对于传统的堆资源管理&#xff0c;我们需要使用成对的new和delete&#xff0c;这样若忘记delete就会造成内存泄露。因此&#xff0c;我们应尽可能以对象管理资源&#xff0c;并采用RAII&#xff08;Resource Acqu…...

自定义RedisTemplate序列化器

大纲 RedisSerializerFastJsonRedisSerializer自定义二进制序列化器总结代码 在《RedisTemplate保存二进制数据的方法》一文中&#xff0c;我们将Java对象通过《使用java.io库序列化Java对象》中介绍的方法转换为二进制数组&#xff0c;然后保存到Redis中。实际可以通过定制Red…...

Flutter 中的 CupertinoContextMenuAction 小部件:全面指南

Flutter 中的 CupertinoContextMenuAction 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;CupertinoContextMenuAction 是一个专门用于构建 iOS 风格的上下文菜单选项的组件。它为用户提供了一种便捷的方式来执行与特定项目相关的操作&#xff0c;例如在列表项上长按可…...

Element-Ul快速入门

引言 Element UI是一个vue.js的桌面UI库。它提供了一套丰富、灵活和实用的UI组件&#xff0c;使开发者能以最少的时间和代码量完成复杂的界面设计。本文将会介明如何快速上手Element UI。 安装和基本使用 首先&#xff0c;你需要在你的项目中安装Element UI。如果你已经安装…...

Django的模型层——2模型实例

1. 类的属性 objects&#xff1a;是Manager类型的对象&#xff0c;用于与数据库进行交互 当定义模型类时没有指定管理器&#xff0c;则Django会为模型类提供一个名为objects的管理器 支持明确指定模型类的管理器 class BookInfo(models.Model):...books models.Manager()当为…...

Python筑基之旅-MySQL数据库(四)

目录 一、数据表操作 1、新增记录 1-1、用mysql-connector-python库 1-2、用PyMySQL库 1-3、用PeeWee库 1-4、用SQLAlchemy库 2、删除记录 2-1、用mysql-connector-python库 2-2、用PyMySQL库 2-3、用PeeWee库 2-4、用SQLAlchemy库 3、修改记录 3-1、用mysql-conn…...

OceanBase SQL 诊断和调优实践——【DBA从入门到实践】第七期

数据库作为绝大多数应用系统储存数据的核心系统&#xff0c;在用户系统需要访问数据时&#xff0c;有着至关重要的作用。在这些交互中&#xff0c;SQL 语言是应用与数据库系统之间“沟通”的桥梁&#xff0c;它负责将应用的指令传达给数据库。因此&#xff0c;SQL 的性能好坏直…...

C++之std::is_trivially_copyable(平凡可复制类型检测)

目录 1.C基础回顾 1.1.平凡类型 1.2.平凡可复制类型 1.3.标准布局类型 2.std::is_trivially_copyable 2.1.定义 2.2.使用 2.3.总结 1.C基础回顾 在C11中&#xff0c;平凡类型&#xff08;Trivial Type&#xff09;、平凡可复制类型&#xff08;TrivialCopyable&#x…...

宝石收集,tarjan

0宝石收集 - 蓝桥云课 (lanqiao.cn) nint(input()) s0input() mint(input()) mp[[] for i in range(n1)] for i in range(m):a,bmap(int,input().split())a1b1mp[a].append(b)import sys sys.setrecursionlimit(100000000) dfn[0 for i in range(n1)] low[0 for i in range(n1…...

python 面对对象 类 继承

继承 继承就是为了解决两个有大量重复性代码的类&#xff0c;抽象出一个更抽象的类放公共代码&#xff0c;主要是代码复用&#xff0c;方便代码的管理与修改 类的继承包括属性和方法&#xff0c;私有属性也可继承 class Person(): # 默认是继承object超类pass…...

Rust腐蚀怎么用服务器一键开服联机教程

1、进入控制面板 首次登陆需要点击下方重置密码&#xff0c;如何再点击登录面板&#xff0c;点击后会跳转到登录页面&#xff0c;输入用户名和密码登录即可 2、设置游戏端口 由于腐蚀的设置需要三个端口&#xff0c;它们用于游戏端口&#xff08;必须为首选端口&#xff09;&a…...

公共代理IP和独享代理IP之间的区别?

公共代理IP和独享代理IP在网络应用中扮演着不同的角色&#xff0c;它们之间的区别主要体现在使用方式、性能、安全性以及隐私保护等方面。以下是对这两种代理IP的详细对比和分析。 第一点就是使用的方式以及成本上的不同&#xff0c;公共代理IP&#xff0c;顾名思义&#xff0…...

基于Vue的前端自定义询问弹框与输入弹框组件的设计与实践

基于Vue的前端自定义询问弹框与输入弹框组件的设计与实践 摘要 随着技术的不断进步&#xff0c;前端开发面临越来越多的挑战&#xff0c;其中之一就是如何有效管理复杂的业务逻辑和用户体验。传统的整块应用开发方式在面对频繁的功能变更和用户体验优化时&#xff0c;往往显得…...

WordPress AI: 7.0如何为AI驱动的网站奠定基础

此前&#xff0c;所有集成人工智能的 WordPress 插件都必须自行构建基础架构。 即将推出的 WordPress 7.0 版本改变了这一现状&#xff0c;它引入了共享的基础架构&#xff0c;支持 AI 在各个站点上的运行。 AI 工具现在可以发现网站的功能&#xff0c;通过统一的层访问 Word…...

Token经济学正在重构芯片工程师的生存逻辑(万字长文深度拆解“token“这个计量单位的对于芯片工程师的意义)

英伟达CEO黄仁勋把AI产业分成五层&#xff1a;能源、芯片、基础设施、模型、应用。芯片在第二层&#xff0c;属于重资产制造业的核心环节。但问题来了&#xff0c;在 芯片&#xff08;包括AI芯片&#xff09;成本内卷时代&#xff0c;芯片工程师的技术&#xff0c;到底还能值多…...

卷积神经网络(CNN)与深度学习视觉应用综述

在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;是实现计算机视觉任务的基石。通过对这些基础理论的学习&#xff0c;我们能够构建起从特征提取到复杂场景理解的知识体系。第一部分&#xff1a;卷积神经网络基础1. 全连接网络面临的挑战传统的全连接神经网…...

Apache Fesod:Java开发者处理海量Excel数据的终极解决方案

Apache Fesod&#xff1a;Java开发者处理海量Excel数据的终极解决方案 【免费下载链接】fesod Fast. Easy. Done. Processing spreadsheets without worrying about large files causing OOM. 项目地址: https://gitcode.com/gh_mirrors/fast/fesod 在处理海量Excel数据…...

【运维必备Linux系统知识】

文章目录一、Linux系统整体结构1、核心特点2、常见发行版3、主要应用场景4、目录结构5、系统核心组成二、Linux基础必备命令1、目录与文件操作2、文件查看与编辑3、文件查找与搜索4、系统信息查看5、用户与权限管理6、进程管理7、网络常用命令8、打包压缩与解压9、系统开关机&a…...

UE5 RPG实战:告别旧输入系统,用增强输入(Enhanced Input)优雅触发你的技能

UE5 RPG开发实战&#xff1a;用增强输入系统重构技能触发逻辑在虚幻引擎5的RPG开发中&#xff0c;输入管理一直是困扰中高级开发者的痛点。当角色拥有数十个技能、多种状态&#xff08;步行、骑马、施法等&#xff09;时&#xff0c;传统的输入系统往往导致代码臃肿、难以维护。…...

P15729 [JAG 2024 Summer Camp #2] Add Add Add 题解

P15729 [JAG 2024 Summer Camp #2] Add Add Add Link: https://www.luogu.com.cn/problem/P15729 题目描述 给定两个长度为 NNN 的正整数序列 (A1,A2,…,AN)(A_1, A_2, \ldots, A_N)(A1​,A2​,…,AN​) 和 (B1,B2,…,BN)(B_1, B_2, \ldots, B_N)(B1​,B2​,…,BN​)。对于 …...

手把手教你解锁影驰B360M主板隐藏的fTPM 2.0,绕过限制升级Win11(附BIOS修改避坑指南)

解锁影驰B360M主板fTPM 2.0的完整实战手册当Windows 11的升级提示弹出时&#xff0c;许多使用影驰B360M主板的用户发现自己的设备被系统要求拒之门外——原因很简单&#xff1a;主板BIOS中缺少必要的fTPM 2.0支持选项。这并非硬件不支持&#xff0c;而是厂商在固件层面隐藏了相…...

Unity手游开发避坑:InputSystem处理触屏摇杆与视角滑动的冲突(实战解决方案)

Unity手游触控优化&#xff1a;彻底解决虚拟摇杆与视角滑动的冲突问题移动端游戏开发最令人头疼的瞬间&#xff0c;莫过于玩家愤怒反馈"角色走着走着突然镜头乱转"的时刻。这种左右手操作互相干扰的问题&#xff0c;本质上是多点触控管理机制不完善导致的。本文将深入…...

ThriftPy在微服务架构中的应用:企业级RPC服务搭建实战

ThriftPy在微服务架构中的应用&#xff1a;企业级RPC服务搭建实战 【免费下载链接】thriftpy Thriftpy has been deprecated, please migrate to https://github.com/Thriftpy/thriftpy2 项目地址: https://gitcode.com/gh_mirrors/th/thriftpy ThriftPy是一个纯Python实…...