mybatis-plus - 乐观锁的使用

发布时间:2026/11/6 3:29:07

mybatis-plus - 乐观锁的使用 mybatis-plus - 乐观锁的使用添加版本号更新插件BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();interceptor.addInnerInterceptor(newOptimisticLockerInnerInterceptor());returninterceptor;}实体的乐观锁字段 version添加Version注解注意:数据库也需要添加 version 字段ALTERTABLEUSERADDVERSIONINTDEFAULT1;#int类型 乐观锁字段支持的数据类型只有: int, Integer, long, Long, Date, Timestamp, LocalDateTime仅支持updateById(entity)和update(entity, wrapper)前提entity ! null。VersionprivateIntegerversion;正常更新使用即可//演示乐观锁生效场景TestpublicvoidtestQuick7(){// 先查询, 在更新, 获取version数据// 同时查询两条, 但是 version 唯一, 最后更新的失败UseruseruserMapper.selectById(5);Useruser1userMapper.selectById(5);user.setAge(20);user1.setAge(30);userMapper.updateById(user);// 乐观锁生效,失败!userMapper.updateById(user1);}有个坑坑1 - 新增的时候 version 没值第一次更新直接失败如果新增没带、数据库没设置 default 1insert 之后 versionnull。第一次 updateById 时where 条件versionnull数据库判断null null不是 true更新行数 0直接报冲突。✅ 规范数据库字段version int default 1实体不用手动 set version新增 MP 不会处理 version靠数据库默认值。坑2 - 只判断 rows 0但是分不清 “数据不存在” 和 “版本冲突”introwsmapper.updateById(entity);if(rows0){thrownewRuntimeException(数据被别人修改请重试);}问题rows0有两种可能id 不存在id 存在但是 version 不匹配并发修改。上面代码会把这两种情况混在一起抛同一个异常前端提示会误导用户。✅ 业务优化更新前必须先selectById判断记录是否存在再执行更新rows0才判定为乐观锁冲突。Userusermapper.selectById(id);if(usernull){thrownewBusinessException(记录不存在);}// 修改字段introwsmapper.updateById(user);if(rows0){thrownewBusinessException(数据已被其他用户修改请刷新页面重试);}updateById(entity)✅ 最稳业务首选。最常用不容易踩坑。先查拿到version改字段updateById。update(entity, wrapper)✅ 能用但尽量少用。为什么少用where条件 主键(如果实体带id) wrapper条件 AND version?条件叠加容易写出意料之外的SQL。例子实体id1wrapper写eq(id,2)where就变成id1 AND id2 AND version?直接更新0行这种bug很难排查。很多新人踩这个坑实体带idwrapper又写id条件冲突。
延伸阅读

更多相关文章

2026/11/6 3:29:07

WSL2 AI 环境搭建实录:Docker 与 Miniconda 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 4:39:18

从CVE-2010-2883看PDF字体解析栈溢出与检测防护

2010 年的那份 PDF,现在回头看,依然是我给新人讲漏洞分析时最爱拿来当教材的样本。它不复杂到劝退,也不简单到没营养——一个嵌进文档里的字体表,几个没有做长度校验的字段,一段可控的栈上拷贝,最后绕过当时…

2026/11/6 4:39:18

Visual Paradigm文本分析:从需求文本到UML候选元素

第一次把一段两千字的需求描述粘进文本分析面板、点下分析按钮的时候,我盯着右边跳出来的一堆候选词有点发懵——大部分确实是我写进文档里的名词,但有一半根本不该成为类。后来连着几个项目反复用下来才想明白,这个功能最值钱的地方并不在于…

2026/11/6 4:39:18

制造业EDI系统对接:中间库架构的技术破局与实践

1. 制造业出海面临的EDI连接困境在全球化供应链深度融合的今天,中国制造企业正面临着一个看似技术性却关乎生存的核心挑战——EDI(电子数据交换)系统对接。作为从业十余年的供应链系统架构师,我见证了太多企业在这个环节折戟沉沙。…

2026/11/6 4:39:18

RTP/RTCP协议解析与实时音视频传输优化

1. 实时传输协议基础认知第一次接触实时音视频传输的开发人员,常会被RTP/RTCP这两个孪生协议搞得晕头转向。这组协议就像快递行业的配送员与客服专员——RTP负责将媒体数据包准确投递到目的地,而RTCP则持续收集配送质量报告,动态调整运输策略…

2026/11/6 4:39:18

macOS Docker运行systemd容器的解决方案

## 1. 问题现象与背景解析最近在macOS Monterey(12.6)上使用Docker Desktop(4.15.0)时遇到了一个典型问题:当尝试启动基于systemd的容器镜像时,控制台抛出错误提示"systemd not running on this host&…

2026/11/6 4:34:17

单链表实现与核心操作详解

1. 单链表基础概念解析单链表作为数据结构中最基础也最重要的线性结构之一,是每个程序员必须掌握的硬核技能。记得我初学链表时,曾被指针的指针绕得头晕目眩,直到亲手实现了一遍所有操作才真正理解其精髓。本文将用8000字的篇幅,带…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 1:03:39

MCU晶振电路设计全解析:从负载电容计算到PCB布局调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑