【进阶之路】Mybatis-Plus中乐观锁@version注解的问题与解决方案

大家好,我是练习java两年半时间的南橘,从一名连java有几种数据结构都不懂超级小白,到现在懂了一点点的进阶小白,学到了不少的东西。知识越分享越值钱,我这段时间总结(包括从别的大佬那边学习,引用)了一些平常学习和工作中的重点(自我认为),希望给大家带来一些帮助

这篇文章源于周五一次生产问题,公司代码紧急上线之后,突然出现信息无法更新的问题。在排查日志文件以后,惊奇的发现没有任何错误日志,同时一个事务中的两个update方法竟然只有一条执行成功。

大家都感觉比较惊奇,然后开始肉眼对代码进行review,这次出问题的代码比较特殊,在测试环境中无法做到复刻,所以也没办法重现问题,在review的过程中,最开始以为是@transcational注解的问题,但是发现数据库insert的信息并没有被回滚。

最终,因为项目中引入了Mybatis-Plus,大家逐渐定位到了@version这一个注解上。

在官方文档中,version注解并没有太多解释,但是我们都知道乐观锁的原理。

  • 1 在取出记录时,获取当前的数据version=1

  • 2 代码更新时,带上这个 version 1

  • 3 执行更新时,set version = version +1 where version = version

  • 4 如果 version 不对,就更新失败

包括乐观锁还有CAS其他的一些问题,我们可以在这篇文章里深入了解【进阶之路】包罗万象——JAVA中的锁

我们可以在代码中复现这个问题。

首先我们的类中是有@version这个注解的

我们能够看出,因为version值的相同,导致更新失败了

然后我们去掉Version之后,又可以正常更新。

那我们如何解决这个问题呢?如果在一个方法内有两个相同的类需要更新,我们在保证值的正确的情况下,可以主动给它+1,这样就能改变它的预期,解决乐观锁的问题。

当然,乐观锁是有预期值B的,主动+2是没有用的~

@Version 用于注解实体字段,必须要有,数据库中也应有对应的字段,不然的话这次不会对代码有任何的影响。

这是一次简单的生产问题,而且很快就解决了,不过网上并没有这样的实例,但是它让我们能够更好地理解每一行代码的含义,并且重新复习了一下乐观锁。

这是这篇文章的思维导图,因为用的是免费版的软件,所以有不少水印,需要原版的可以问我要

posted @ 2020-11-02 11:34  南橘ryc  阅读(3512)  评论(0编辑  收藏  举报