乐观锁

主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

(1)数据库中添加version字段

ALTER TABLE `user` ADD COLUMN `version` INT
(2)实体类添加version字段
并添加 @Version 注解
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;

(3)元对象处理器接口添加version的insert默认值


@Override
public void insertFill(MetaObject metaObject) {......this.setFieldValByName("version", 1, metaObject);
}

特别说明:

  • 支持的数据类型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1
  • newVersion 会回写到 entity 中
  • 仅支持 updateById(id) 与 update(entity, wrapper) 方法
  • 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
(4)在 MybatisPlusConfig 中注册 Bean
创建配置类
package com.leon.mpdemo1010.config;import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;@Configuration
@MapperScan("com.leon.mpdemo1010.mapper")
public class MpConfig {//乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}}

(5)测试乐观锁可以修改成功

测试后分析打印的sql语句,将version的数值进行了加1操作

//测试乐观锁
@Test
public void testOptimisticLocker() {//根据id查询数据User user = userMapper.selectById(1231115382920916994L);//进行修改user.setAge(200);userMapper.updateById(user);
}

(5)测试乐观锁修改失败

/*** 测试乐观锁插件 失败*/
@Test
public void testOptimisticLockerFail() {//查询User user = userMapper.selectById(1L);//修改数据user.setName("Helen Yao1");user.setEmail("helen@qq.com1");//模拟取出数据后,数据库中version实际数据比取出的值大,即已被其它线程修改并更新了versionuser.setVersion(user.getVersion() - 1);//执行更新userMapper.updateById(user);}

MybatisPlus实现乐观锁相关推荐

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

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

  2. MyBatisPlus的乐观锁和悲观锁

    MyBatisPlus的乐观锁和悲观锁 1.乐观锁 1.1 场景 2.0 乐观锁与悲观锁 3.0 模拟修改冲突 Demo 4.0 通过乐观锁观念解决问题 文章顺序及整体目录可查看(点我即可) 1.乐观 ...

  3. Mybatis-Plus的乐观锁和悲观锁

    乐观锁和悲观锁 如果没看懂.需要看下操作系统 模拟修改冲突 创建数据 CREATE TABLE t_product (id BIGINT(20) NOT NULL COMMENT '主键id',NAM ...

  4. mybatis-plus 使用乐观锁修改

    title 乐观锁与悲观锁 解决方案 code 测试 乐观锁与悲观锁 乐观锁:十分乐观,总是认为不会出现问题,无论干什么,都不会去上锁.如果出现了问题,就再次更新值测试. 悲观锁:十分悲观,认为总是出 ...

  5. springboot 使用mybatis-plus 配置乐观锁

    新增 Mybatis plus乐观锁插件 配置类 package com.engine.cmdbsync.config;import com.baomidou.mybatisplus.extensio ...

  6. springboot 使用mybatis-plus 配置乐观锁。

    -----------------------------官方文档已更新,详细配置请访问:mybatis plus乐观锁插件 进行查看--------------------------------- ...

  7. Mybatis-Plus实现乐观锁配置

    乐观锁 主要解决 丢失更新问题 12306抢票问题 多人抢票 只有一人可以得到 第一步 数据库表中添加 version字段 第二步 在User实体类中添加属性并且加上@Version注解 @Versi ...

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

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

  9. MybatisPlus中乐观锁的配置

    1.什么是乐观锁? 乐观锁:十分乐观,它总是认为不会出现问题,无论干什么,都不去上锁!如果出现了问题,就重新更新值. 2.什么是悲观锁? 悲观锁:十分悲观,它总是认为会出现问题,无论干什么,都加上锁, ...

最新文章

  1. 装饰器的定义、语法糖用法及示例代码
  2. python3 进度条_详细介绍Python进度条tqdm的使用
  3. [python]_ELVE_pip2和pip3如何共存
  4. 工业以太网交换机的冗余功能及发展历程介绍
  5. 暴露的全局方法_史上最便捷搭建 ZooKeeper 服务器的方法
  6. python sklearn svm 权重_sklearn svm基本使用
  7. 【转载】spring mvc 使用session
  8. 基于二进制粒子群算法的配电网故障诊断- 附代码
  9. linux下查看进程与线程
  10. 大学计算机第一学期期末考试试题,《大学计算机基础》期末考试试题(A卷)..doc...
  11. 【行业应用】阿里云实时计算 Flink 版 IoT 行业解决方案
  12. win10计算机管理 分区,win10系统自带磁盘管理工具调整硬盘分区大小的详细方案...
  13. 深入浅出ASP .NET Core学习记录
  14. 多块英伟达K80显卡linux安装,ubuntu14.04下NVIDIA Tesla K80 、GTX1080顯卡驅動以及Tensorflow、Python的安裝教程...
  15. 网络爬虫——原理简介
  16. 异步爬取有道词典(入门js逆向)
  17. opencv与openmv?
  18. python中噪音是什么意思_Perlin噪声和Python的ctypes
  19. 去角质剂和磨砂膏行业调研报告 - 市场现状分析与发展前景预测
  20. ABCD四个人说真话的概率都是1/3。假如A声称B否认C说D是说谎了,那么D说过的那句话真话的概率是多少

热门文章

  1. CSS中list-style详解
  2. mysql四:数据操作
  3. vue设置全局变量或函数
  4. 根据json对象的某一属性对其进行排序
  5. 2017年1月22日 10:00
  6. Python之print 格式化输出
  7. jquery源码--merge grep type trim
  8. Java多线程初学者指南(5):join方法的使用
  9. ip sensor芯片级解决方案
  10. 关于Oracle Developer 的 DBMS_OUTPUT.PUT_LINE 输出问题