MyBatis-Plus 高级功能 —— 乐观锁插件
一、引言
先来大概普及一下数据库锁的概念
悲观锁:时刻保持着一个悲观的态度,对谁都不信任,总想着别人会修改我的数据,所以为了防止别人修改,每次都会上锁,防止别人修改自己的数据。导致的后果就是每次想要拿到数据就必须要等待拿到锁,是一个很浪费时间的过程,如果访问量很大就是悲观锁一个致命的缺陷。
乐观锁:乐观锁对这个世界都很乐观,对每个想要获取数据的操作,他都会认为大家不会对自己的数据进行修改,所以不会上锁,在访问量很大的时候相比于悲观锁,节省了很多时间,用户不需要等待获取锁。
如果说大量读取数据操作的时候,适合使用乐观锁。如果冲突较多建议使用悲观锁。
悲观锁实现方式是数据库采用加锁的机制,而乐观锁最常见的手动就是通过版本号,每次更新的时候需要判断版本号是否一致,如果一致才能正常更新,反之更新失败。
二、具体现实
- 步骤一:配置乐观锁插件,这个采用的springboot的配置方式。
@Configuration
public class MyBatisPlusConfig {/*** 乐观锁插件* @return*/@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor(){return new OptimisticLockerInterceptor();}
}
- 步骤二:在实体类版本号的字段上加注解
/**
- 版本号
*/
@Version
private Integer version;
- 步骤三:测试调用,
从SQL语句得出MP会把设置进去的版本号当作更新条件,并且版本号+1更新进去。
@Test
public void update(){// 更新对象User user = new User();user.setEmail("Test1111@email.com");user.setId(1L);// 需要把之前从数据库读出来的版本号设置进去user.setVersion(1);int update = userMapper.updateById(user);System.out.println(update);
}
DEBUG==> Preparing: UPDATE sys_user SET email=?, update_time=?, version=? WHERE id=? AND version=? AND is_delete='0'
DEBUG==> Parameters: Test1111@email.com(String), 2019-09-19T16:00:38.149(LocalDateTime), 2(Integer), 1(Long), 1(Integer)
DEBUG<== Updates: 1
三、使用注意细节
细节一:支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
细节二:
仅支持 updateById(id) 与 update(entity, wrapper) 方法
细节三:
在 update(entity, wrapper) 方法下, wrapper不能复用
,这里小编给大家演示一下把,通过执行SQL语句看出,第一次更新是成功了,但是第二次更新失败了,在条件后面有两个版本号的条件。
@Test
public void updateByMyWrapper() {// 条件构造器QueryWrapper<User> wrapper = Wrappers.query();wrapper.eq("name", "admin");// 对象1User user = new User();user.setEmail("Test@email.com");user.setVersion(2);userMapper.update(user,wrapper);// 对象2User user2 = new User();user2.setEmail("Test2@email.com");user2.setVersion(3);// 注意,注意,这里的wrapper,和上面是是用的同一个userMapper.update(user2,wrapper);}
updateFill......
DEBUG==> Preparing: UPDATE sys_user SET email=?, update_time=?, version=? WHERE is_delete='0' AND name = ? AND version = ?
DEBUG==> Parameters: Test@email.com(String), 2019-09-19T16:06:26.172(LocalDateTime), 3(Integer), admin(String), 2(Integer)
DEBUG<== Updates: 1
updateFill......
DEBUG==> Preparing: UPDATE sys_user SET email=?, update_time=?, version=? WHERE is_delete='0' AND name = ? AND version = ? AND version = ?
DEBUG==> Parameters: Test2@email.com(String), 2019-09-19T16:06:26.238(LocalDateTime), 4(Integer), admin(String), 2(Integer), 3(Integer)
DEBUG<== Updates: 0
文章转自
MyBatis-Plus 高级功能 —— 乐观锁插件相关推荐
- MyBatisPlus插件扩展_OptimisticLockerInterceptor乐观锁插件的使用
场景 项目搭建专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/37194 简介 意图: 当要更新一条记录的时候,希望这条记录没有被别 ...
- mybatis-plus使用乐观锁插件
参考博文 https://baijiahao.baidu.com/s?id=1659469738216922362&wfr=spider&for=pc 1 没有锁的风险 开发不设锁,就 ...
- MP实战系列(十七)之乐观锁插件
声明,目前只是仅仅针对3.0以下版本,2.0以上版本. 意图: 当要更新一条记录的时候,希望这条记录没有被别人更新 乐观锁实现方式: 取出记录时,获取当前version 更新时,带上这个version ...
- 【Mybatis-Plus】(四)分页、乐观锁插件 通用枚举 多数据源
写在前面
- 浅谈:MyBatis-Plus的CRUD与乐观锁,分页插件,逻辑删除
浅谈:MyBatis-Plus的CRUD与乐观锁,分页插件,逻辑删除 MyBatis-Plus官方文档连接 什么是MyBatis-Plus 请点击上面官方文档查看 代码演示:代码注释为功能详细解释 数 ...
- mybatis 乐观锁_MybatisPlus新特性之逻辑删除、乐观锁、自动填充
MP特性 公共字段的自动填充功能 自动更新全局属性,比如创建的时间修改的时间,这样就不用每执行一次插入更新操作都带上一个set大大节省了很多效率,从而也避免为了因为时间格式的不统一问题. 为了输出日志 ...
- 新版的Mybatis-Plus使用乐观锁,MP_OPTLOCK_VERSION_ORIGINAL与新版插件的使用方法
新版的Mybatis-Plus使用乐观锁,MP_OPTLOCK_VERSION_ORIGINAL与新版插件的使用方法 在旧版的配置类我们一般直接注册就行了 // 注册乐观锁插件@Beanpublic ...
- MyBatis-Plus 乐观锁 防止超卖、逻辑删除、自动填充、Id自增
MyBatis-Plus 乐观锁 防止超卖.逻辑删除.自动填充 Day3 前面的简单的讲了一下mybatis-plus的使用 当然有很多不足 我写博客就是想促进大家一起学习 也想让这些内容更简单一些. ...
- ssm框架逻辑删除mysql_MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据...
目录 一.insert 1.插入操作 2.主键策略 二.update 1.根据Id更新操作 2.自动填充 3.乐观锁 三.select 1.根据id查询记录 2.通过多个id批量查询 3.简单的条件查 ...
最新文章
- R语言使用ggplot2包的快速可视化函数qplot绘制散点图(设置每个数据点的文本标签信息)实战
- Pandas简明教程:八、Pandas数据透视表
- C/C++中程序内存区域划分大总结
- JVM-Java内存区域
- mysql中索引类型索引方法_MYSQL索引的类型和索引的方式
- c盘扩展卷功能只能向右扩展_信用风险管理:功能扩展和选择
- (转)从零实现3D图像引擎:(6)向量函数库
- ubuntu meld比较文件差异
- hdu 1569 1565 (二分图带权最大独立集 - 最小割应用)
- Win10技巧:如何确定电脑是否适用Hyper-V虚拟机?
- 每天一点正则表达式积累(三)
- MySQL Audit 审计
- javalang 生成抽象语法树AST ----python源码分析
- Asp连接Oracle (包含绿色版12.2客户端和ODBC驱动安装)
- 沙漠之花--华莉丝·迪里
- C# WinForm中Form的load和Shown事件
- FFT(傅里叶快速变换算法)计算频率
- 外国大的电子公司的名称
- Hadoop安装 搭建
- 10、IDL实操中的问题和解决方法