大家好,我是练习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 用于注解实体字段,必须要有,数据库中也应有对应的字段,不然的话这次不会对代码有任何的影响。

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

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

  1. 【Spring】27、JPA 实现乐观锁@Version注解的使用

    持久层使用jpa时,默认提供了一个注解@Version来实现乐观锁 简单来说就是用一个version字段来充当乐观锁的作用.先来设计实体类 /** * Created by xujingfeng on ...

  2. mybatis 如何使用乐观锁

    悲观锁的问题: 因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是 ...

  3. [转]MySQL中乐观锁、悲观锁(共享锁、排他锁)简介

    InnoDB与MyISAM Mysql 在5.5之前默认使用 MyISAM 存储引擎,之后使用 InnoDB. MyISAM 操作数据都是使用的表锁,你更新一条记录就要锁整个表,导致性能较低,并发不高 ...

  4. MySQL中乐观锁和悲观锁 原理、区别

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据 ...

  5. 乐观锁-version的使用

    出处:http://chenzhou123520.iteye.com/blog/1863407 乐观锁介绍: 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般 ...

  6. Mybatis-Plus乐观锁Version

    实现原理 取出记录时,获取当前version更新时,带上这个version执行更新时, set version = newVersion where version = oldVersion如果ver ...

  7. Java Hibernate中的悲观锁和乐观锁的实现

    锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...

  8. web开发中的两把锁之数据库锁:(高并发--乐观锁、悲观锁)

    这篇文章讲了 1.同步异步概念(消去很多疑惑),同步就是一件事一件事的做:sychronized就是保证线程一个一个的执行. 2.我们需要明白,锁机制有两个层面,一种是代码层次上的,如Java中的同步 ...

  9. B8 Concurrent JDK中的乐观锁与原子类

    [概述] 乐观锁采用的是一种无锁的思想,总是假设最好的情况,认为一个事务在读取数据的时候,不会有别的事务对数据进行修改,只需要在修改数据的时候判断原数据数据是否已经被修改了.JDK 中 java.ut ...

随机推荐

  1. centOS7永久关闭防火墙(防火墙的基本使用(转)

    查看防火墙状态: systemctl status firewalld.service 如图 绿的running表示防火墙开启 执行关闭命令: systemctl stop firewalld.ser ...

  2. Kettle学习笔记(一)

    Kettle简介 Kettle是一款国外开源的ETL工具,纯java编写,可以在Windows.Linux.Unix上运行,s数据抽取高效稳定.Kettle 中文名称叫水壶,该项目的主程序员MATT ...

  3. jinjia2语言

    金家兔 网站: https://jinja.palletsprojects.com/en/2.11.x/ #Jinja is Beautiful {% extends "layout.htm ...

  4. redis过期事件,swoole监听

    $serv = new Swoole\Server('0.0.0.0', 9501, SWOOLE_BASE, SWOOLE_SOCK_TCP); $serv->set(array( 'work ...

  5. IDEA配置类和方法注释模板

    1定义java文件头部的注释 2给java类中的方法添加上注释 2.1第一步勾选Enable Live  Templates 2.2第二步新建一个Group 2.3第三步新建一个Template 2. ...

  6. Win32之进程创建过程

    0x01. 什么是进程? 进程提供程序所需要的资源,如:数据.代码等等 进程扮演的角色仅仅是为当前程序提供资源,或者代码,这就是进程所提供的,当时程序运行的状态和进程没有关系,进程可以看做空间的概念 ...

  7. 什么是SOAP?SOAP有什么用?什么时候会用到SOAP?

    什么是SOAP SOAP(Simple Object Access Protocol)一般指简单对象访问协议,简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML(标准通用标记语 ...

  8. 群晖DS218+部署mysql

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. python 数据分析之pandas

    pandas 是数据分析时必须用到的一个库,功能非常强大 其有两种数据结构:一维Series   二维表DataFrame(一般读取后的数据都是df) 导入:import pandas as pd 数 ...

  10. LuoguP1286 两数之和

    题面概括 将n个数两两相加得到n*(n-1)/2个和,给出这些和,求所有原数方案 n<=500 LuoguP1286 题解 此题原题是 n<10, 没啥可做的 先将 \(n*(n-1)/2 ...