MP(MyBatis-Plus)实现乐观锁更新功能的示例代码

 更新时间:2021年01月10日 10:58:43   作者:程序员自由之路  
这篇文章主要介绍了MP(MyBatis-Plus)实现乐观锁更新功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

实现步骤

step1:添加乐观锁拦截器

MP的其他拦截器功能可以参考官网

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
  MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  return interceptor;
}

step2:配置Entity

@TableField(fill = FieldFill.UPDATE)
@Version
private Date updateTime;

用更新字段充当版本号。

  • 上面的配置需要注意的是:updateTime既配置自动填充,又配置了乐观锁功能。MP在进行处理时会先进行乐观锁处理,然后再进行自动填充。
  • 问题:前端送了id和一些需要更新的字段过来,每次需要从数据库中查出version,然后再进行更新(要么前端将版本号传过来);
  • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime;
  • 仅支持 updateById(id) 与 update(entity, wrapper) 方法,在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
  • 对于updateTime这个字段,在数据库中建议设置成时区不相关的时间戳类型。

多说一点

使用updateTime作为版本号可能会存在一些问题。

我们通常需要将updateTime返回给前端页面,假如我们不做任何设置,返回前端的数据大概是下面的样子:

{
 "userId": 367,
 "address": "上海市自由之路xxxxxx...",
 "workUnit": "XXXX",
 "createTime": "2020-12-22T00:00:00.000+08:00",
 "updateTime": "2021-01-08T17:28:14.782+08:00"
}

这种时间格式可能不是前端页面需要的,这是我们可以进行如下设置;

spring:
 jackson:
  default-property-inclusion: non_null
  time-zone: GMT+8
  date-format: yyyy-MM-dd HH:mm:ss

返回的数据

{
 "userId": 367,
 "address": "上海市自由之路xxxxxx...",
 "workUnit": "XXXX",
 "createTime":"2020-12-22 00:00:00",
 "updateTime":"2021-01-08 17:28:14"
}

经过这个配置后,就可以得到可读性比较好的时间格式了。但是我们需要注意的时候,这个时间的精度其实已经丢失了,当前提交修改数据到后端,这个值和数据库中的值已经不相等了。所以永远不能将数据更新成功。

所以这种情况下使用updateTime来进行乐观锁更新就不太适合了。可以考虑在表中另外加一个字段version来进行乐观锁更新。

但其实还是有比较好的解决办法的。

首先,我们不要对返回的时间格式进行全局话配置。

spring:
 jackson:
  default-property-inclusion: non_null
  time-zone: GMT+8
  # date-format: yyyy-MM-dd HH:mm:ss

然后,添加一个updateTime的备份字段updateTimeSimpleFormat,并对这个字段进行单独的时间格式化。

private Date updateTime;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTimeSimpleFormat;
updateTimeSimpleFormat不要生成get和set方法,在updateTime的set方法中对updateTimeSimpleFormat进行赋值。


public void setUpdateTime(Date updateTime) {
   this.updateTime = updateTime;
   this.updateTimeSimpleFormat = updateTime;
 }

这样就既能满足前端返回格式化的时间,后端又能获取到乐观锁的版本号。

但是,这个方法比较不好的地方,就是必须对每个时间格式进行@JsonFormat注解配置,不能进行全局配置,比较繁琐。

总结:使用updateTime作为乐观锁的优点就是不需要再新加字段,比较简洁。但是带来的问题上面已经讲的很清楚了。还是印证了那个真理:没有完美的技术,只有适合的技术。

到此这篇关于MP(MyBatis-Plus)实现乐观锁更新功能的示例代码的文章就介绍到这了,更多相关MyBatis-Plus乐观锁更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • K均值聚类算法的Java版实现代码示例

    K均值聚类算法的Java版实现代码示例

    这篇文章主要介绍了K均值聚类算法的Java版实现代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • MyBatis-Flex实现分页查询的示例代码

    MyBatis-Flex实现分页查询的示例代码

    在MyBatis-Flex中实现分页查询时,需要注意维护一个获取数据库总数的方法,详细介绍了UserService、UserServiceImpl类以及Mapper.xml配置,感兴趣的可以了解一下
    2024-10-10
  • Spring事务失效的场景梳理总结

    Spring事务失效的场景梳理总结

    实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制,好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,下面这篇文章主要给大家介绍了关于Spring事务失效场景的相关资料,需要的朋友可以参考下
    2023-02-02
  • Java多线程及分布式爬虫架构原理解析

    Java多线程及分布式爬虫架构原理解析

    这篇文章主要介绍了Java多线程及分布式爬虫架构原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • spring boot整合spring-kafka实现发送接收消息实例代码

    spring boot整合spring-kafka实现发送接收消息实例代码

    这篇文章主要给大家介绍了关于spring-boot整合spring-kafka实现发送接收消息的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来看看吧。
    2017-06-06
  • 关于java中自定义注解的使用

    关于java中自定义注解的使用

    这篇文章主要介绍了关于java中自定义注解的使用,注解像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中,需要的朋友可以参考下
    2023-07-07
  • Java聊天室之实现聊天室客户端功能

    Java聊天室之实现聊天室客户端功能

    这篇文章主要为大家详细介绍了Java简易聊天室之实现聊天室客户端功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-11-11
  • Java可重入锁ReentrantLock详解

    Java可重入锁ReentrantLock详解

    这篇文章主要介绍了Java可重入锁ReentrantLock详解,ReentrantLock是一个可重入且独占式的锁,是一种递归无阻塞的同步机制,它支持重复进入锁,即该锁能够支持一个线程对资源的重复加锁,除此之外,该锁的还支持获取锁时的公平和非公平性选择,需要的朋友可以参考下
    2023-09-09
  • Java时间类Date类和Calendar类的使用详解

    Java时间类Date类和Calendar类的使用详解

    这篇文章主要介绍了Java时间类Date类和Calendar类的使用详解,需要的朋友可以参考下
    2017-08-08
  • Java多线程 Producer and Consumer设计模式

    Java多线程 Producer and Consumer设计模式

    这篇文章主要介绍了Java多线程 Producer and Consumer设计模式,producer是生产者的意思:指生产数据的线程,consumer是消费者的意思,指的是使用数据的线程,下文围绕Producer及Consumer展开话题,需要的朋友可以参考一下
    2021-10-10

最新评论