经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
MP(MyBatis-Plus)实现乐观锁更新功能的示例代码
来源:jb51  时间:2021/1/11 10:05:21  对本文有异议

实现步骤

step1:添加乐观锁拦截器

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

  1. @Bean
  2. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  3. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  4. interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  5. return interceptor;
  6. }

step2:配置Entity

  1. @TableField(fill = FieldFill.UPDATE)
  2. @Version
  3. 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返回给前端页面,假如我们不做任何设置,返回前端的数据大概是下面的样子:

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

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

  1. spring:
  2. jackson:
  3. default-property-inclusion: non_null
  4. time-zone: GMT+8
  5. date-format: yyyy-MM-dd HH:mm:ss

返回的数据

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

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

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

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

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

  1. spring:
  2. jackson:
  3. default-property-inclusion: non_null
  4. time-zone: GMT+8
  5. # date-format: yyyy-MM-dd HH:mm:ss

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

  1. private Date updateTime;
  2.  
  3. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  4. private Date updateTimeSimpleFormat;
  5. updateTimeSimpleFormat不要生成getset方法,在updateTimeset方法中对updateTimeSimpleFormat进行赋值。
  6.  
  7.  
  8. public void setUpdateTime(Date updateTime) {
  9. this.updateTime = updateTime;
  10. this.updateTimeSimpleFormat = updateTime;
  11. }
  12.  

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

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

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号