一、引言

先来大概普及一下数据库锁的概念

  • 悲观锁:时刻保持着一个悲观的态度,对谁都不信任,总想着别人会修改我的数据,所以为了防止别人修改,每次都会上锁,防止别人修改自己的数据。导致的后果就是每次想要拿到数据就必须要等待拿到锁,是一个很浪费时间的过程,如果访问量很大就是悲观锁一个致命的缺陷。

  • 乐观锁:乐观锁对这个世界都很乐观,对每个想要获取数据的操作,他都会认为大家不会对自己的数据进行修改,所以不会上锁,在访问量很大的时候相比于悲观锁,节省了很多时间,用户不需要等待获取锁。

如果说大量读取数据操作的时候,适合使用乐观锁。如果冲突较多建议使用悲观锁。

悲观锁实现方式是数据库采用加锁的机制,而乐观锁最常见的手动就是通过版本号,每次更新的时候需要判断版本号是否一致,如果一致才能正常更新,反之更新失败。

二、具体现实

  • 步骤一:配置乐观锁插件,这个采用的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 高级功能 —— 乐观锁插件相关推荐

  1. MyBatisPlus插件扩展_OptimisticLockerInterceptor乐观锁插件的使用

    场景 项目搭建专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/37194 简介 意图: 当要更新一条记录的时候,希望这条记录没有被别 ...

  2. mybatis-plus使用乐观锁插件

    参考博文 https://baijiahao.baidu.com/s?id=1659469738216922362&wfr=spider&for=pc 1 没有锁的风险 开发不设锁,就 ...

  3. MP实战系列(十七)之乐观锁插件

    声明,目前只是仅仅针对3.0以下版本,2.0以上版本. 意图: 当要更新一条记录的时候,希望这条记录没有被别人更新 乐观锁实现方式: 取出记录时,获取当前version 更新时,带上这个version ...

  4. 【Mybatis-Plus】(四)分页、乐观锁插件 通用枚举 多数据源

    写在前面

  5. 浅谈:MyBatis-Plus的CRUD与乐观锁,分页插件,逻辑删除

    浅谈:MyBatis-Plus的CRUD与乐观锁,分页插件,逻辑删除 MyBatis-Plus官方文档连接 什么是MyBatis-Plus 请点击上面官方文档查看 代码演示:代码注释为功能详细解释 数 ...

  6. mybatis 乐观锁_MybatisPlus新特性之逻辑删除、乐观锁、自动填充

    MP特性 公共字段的自动填充功能 自动更新全局属性,比如创建的时间修改的时间,这样就不用每执行一次插入更新操作都带上一个set大大节省了很多效率,从而也避免为了因为时间格式的不统一问题. 为了输出日志 ...

  7. 新版的Mybatis-Plus使用乐观锁,MP_OPTLOCK_VERSION_ORIGINAL与新版插件的使用方法

    新版的Mybatis-Plus使用乐观锁,MP_OPTLOCK_VERSION_ORIGINAL与新版插件的使用方法 在旧版的配置类我们一般直接注册就行了 // 注册乐观锁插件@Beanpublic ...

  8. MyBatis-Plus 乐观锁 防止超卖、逻辑删除、自动填充、Id自增

    MyBatis-Plus 乐观锁 防止超卖.逻辑删除.自动填充 Day3 前面的简单的讲了一下mybatis-plus的使用 当然有很多不足 我写博客就是想促进大家一起学习 也想让这些内容更简单一些. ...

  9. ssm框架逻辑删除mysql_MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据...

    目录 一.insert 1.插入操作 2.主键策略 二.update 1.根据Id更新操作 2.自动填充 3.乐观锁 三.select 1.根据id查询记录 2.通过多个id批量查询 3.简单的条件查 ...

最新文章

  1. R语言使用ggplot2包的快速可视化函数qplot绘制散点图(设置每个数据点的文本标签信息)实战
  2. Pandas简明教程:八、Pandas数据透视表
  3. C/C++中程序内存区域划分大总结
  4. JVM-Java内存区域
  5. mysql中索引类型索引方法_MYSQL索引的类型和索引的方式
  6. c盘扩展卷功能只能向右扩展_信用风险管理:功能扩展和选择
  7. (转)从零实现3D图像引擎:(6)向量函数库
  8. ubuntu meld比较文件差异
  9. hdu 1569 1565 (二分图带权最大独立集 - 最小割应用)
  10. Win10技巧:如何确定电脑是否适用Hyper-V虚拟机?
  11. 每天一点正则表达式积累(三)
  12. MySQL Audit 审计
  13. javalang 生成抽象语法树AST ----python源码分析
  14. Asp连接Oracle (包含绿色版12.2客户端和ODBC驱动安装)
  15. 沙漠之花--华莉丝·迪里
  16. C# WinForm中Form的load和Shown事件
  17. FFT(傅里叶快速变换算法)计算频率
  18. 外国大的电子公司的名称
  19. Hadoop安装 搭建
  20. 10、IDL实操中的问题和解决方法

热门文章

  1. go语言学习---使用os.Args获取简单参数(命令行解析)
  2. [洛谷P4430]小猴打架
  3. snapshot相关
  4. HDU 1153 magic bitstrings(读题+)
  5. eclipse下查看maven下载的源码中文乱码问题
  6. 吴恩达 coursera ML 第三课总结
  7. Python进阶_wxpy学习:机器人对象
  8. kafka消费的三种模式_快速认识Kafka
  9. 【Python】判断列表 list 是否为空
  10. [云炬创业基础笔记] 第四章测试15