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

JAVA-SSM学习9 MyBatisPlus-DML编程控制

夢みてひらひら 私のなかのロマンティック

DML编程控制

实际开发中往往存在多线程并发操作数据库,针对此问题提出了乐观锁悲观锁的概念

乐观锁&悲观锁

乐观锁 (Optimistic Locking)‌:

乐观锁的核心思想是“‌先操作,再检查冲突‌”。它假设在大多数情况下,数据不会被多个线程或事务同时修改,因此在读取数据时不会加锁。只有在提交更新时,才会检查数据是否被其他线程修改过。如果检测到冲突,则更新失败,通常需要重试或回滚操作。

悲观锁 (Pessimistic Locking)‌:

悲观锁的核心思想是“‌先加锁,再操作‌”。它假设在并发环境中,数据冲突是不可避免的,因此在访问数据时立即加锁,确保同一时间只有一个线程或事务能够修改数据。直到操作完成并释放锁后,其他线程才能访问。

乐观锁和悲观锁对比:

适用场景:

乐观锁适用于读多写少、并发冲突少的场景,例如电商秒杀、分布式系统等高并发场景
悲观锁适用于写多读少、并发冲突多的场景。例如金融交易、订单支付等不允许出现数据冲突或不一致的场景

性能对比

乐观锁无锁读取,读取性能高;由于写操作可能失败需重试,写密集时性能下降
悲观锁读取时需加锁,性能开销大;高并发下容易阻塞,吞吐量低

乐观锁实现机制

在数据表中增加一个版本号字段(如version),每次更新数据时,会检查当前版本号是否与读取时的版本号一致。如果一致,则更新并递增版本号;否则,更新失败,需要重试。

核心步骤如下:

①要在对应的数据实体类中添加version属性,并且添加@Version标注
②在拦截器中添加乐观锁拦截器
③执行修改操作时,每次查询修改的数据获取version属性,然后根据version属性执行操作

具体代码如下:

//src/main/java/org/example/Config/MpConfig.java 拦截器设置
@Configuration
public class MpConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor myinterceptor = new MybatisPlusInterceptor();myinterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); //乐观锁插件return myinterceptor;}
}// src/main/java/org/example/pojo/EmpTestData.java 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("emptest")
public class EmpTestData {int id;String name;@TableLogicint deleted;@Versionint version;
}// src/test/java/org/example/MyBatisTestApplicationTests.java@SpringBootTest
class MyBatisTestApplicationTests {@Testvoid testUpdate(){EmpTestData empTestData = empTestDao.selectById(4);empTestData.setName("JokerFive");empTestDao.updateById(empTestData);}
}

效果如下:
修改前数据库表如下:
image
修改后:
image
image

如果存在多次并发修改的话

@SpringBootTest
class MyBatisTestApplicationTests {@Testvoid testUpdate(){EmpTestData empTestData = empTestDao.selectById(4);EmpTestData empTestData2 = empTestDao.selectById(4);empTestData.setName("JokerFive3");empTestData2.setName("JokerFive4");empTestDao.updateById(empTestData);empTestDao.updateById(empTestData2);}
}

那么效果如下:
image
可以看到只有第一次的修改生效,第二次由于version不匹配无法提交修改,需要重新操作
image

http://www.jsqmd.com/news/652361/

相关文章:

  • 跨越“舒适区”:一个Android开发者的纯血鸿蒙转型全记录——从学习阵痛、技术对比到商业回报的真实访谈
  • 10《CAN总线ID分配规则与节点优先级机制详解》
  • LeetCode HOT100 - 合并 K 个升序链表
  • 直播推流避坑指南:为什么你的抖音直播总卡顿?可能是选错了流类型
  • 技术视角深度解析:Infoseek数字公关AI中台架构与实现
  • 解密水体光谱特征:为什么清澈水体在遥感图像上呈现黑色?
  • 别再死记硬背了!用TRIZ功能分析,5步搞定产品设计中的‘过度’与‘不足’
  • 2026年全球网络安全七大趋势(生存法则)
  • 保姆级避坑指南:在ROS Kinetic上从源码编译TurtleBot3仿真包(含Gazebo环境变量报错解决)
  • Vue2 + Element UI 实战:手把手教你封装一个高复用的 SearchForm 搜索组件
  • XCharts 深度解析:Unity 数据可视化图表插件实战指南
  • 力扣热门100题之跳跃游戏
  • 超越Grad-CAM:用大核卷积论文技巧可视化你的CNN感受野(含Colab链接)
  • 面试官视角:操作系统八股文背后的设计哲学与工程权衡(附高频考点拆解)
  • 监管沙盒已批!2026奇点大会公布的AI理财顾问持牌路径全解析,附银保监2025-11号文实操对照表
  • 别再傻傻分不清了!从光线投射到路径追踪,一张图看懂光线追踪的进化史
  • 04-07-06 界定问题框架 - 学习笔记
  • Python实战:打造高效GUI工具,实现BLF与ASC格式CAN数据的批量互转
  • 格式革命:Paperxie 智能排版,让毕业论文告别 “格式地狱“,10 分钟解锁毕业通关密码
  • Dagum基尼系数分解工具:无代码化操作与多场景应用指南
  • Windows Server 2012上IIS配置全攻略:从开启功能到发布第一个网页(附防火墙设置)
  • Redis 主从同步步骤总结
  • 一文读懂:状态管理在Agent中的关键作用与实现
  • 告别DLL缺失烦恼:Visual C++运行库终极一站式解决方案
  • AMD Ryzen调试工具SMUDebugTool完整使用指南:从零开始掌握专业级硬件调优
  • 告别自签名警告!用mkcert 1.4.1为本地开发环境一键搞定HTTPS证书(Windows/Linux保姆级教程)
  • 终极指南:如何用Nucleus Co-Op实现单机游戏本地分屏多人联机
  • 三步永久保存微信聊天记录:WeChatMsg让你告别数据丢失的烦恼
  • DriverStore Explorer完全手册:3步彻底解决Windows驱动管理难题
  • 头部应用鸿蒙重构深度案例:微信、支付宝的适配路径与体验跃迁