iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >怎么使用MyBatisPlus+SpringBoot实现乐观锁功能
  • 710
分享到

怎么使用MyBatisPlus+SpringBoot实现乐观锁功能

2023-07-05 16:07:25 710人浏览 薄情痞子
摘要

今天小编给大家分享一下怎么使用mybatisPlus+SpringBoot实现乐观锁功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了

今天小编给大家分享一下怎么使用mybatisPlus+SpringBoot实现乐观功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    一、商城数据不一致的场景

    如果商城中有一件商品,成本价是80元,售价是100元。经理先是通知小李,说你去把商品价格增加50元。小李正在玩游戏,耽搁了一个小时。正好一个小时后,经理觉得商品价格增加到150元,价格太高,可能会影响销量。又通知小王,你把商品价格降低30元。

    此时,小李和小王同时操作商品后台系统。小李操作的时候,系统先取出商品价格100元;小王也在操作,取出的商品价格也是100元。小李将价格加了50元,并将100+50=150元存入了数据库;小王将商品减了30元,并将100-30=70元存入了数据库。是的,如果没有锁,小李的操作就完全被小王的覆盖了。

    现在商品价格是70元,比成本价低10元。几分钟后,这个商品很快出售了1千多件商品,老板亏1万多。

    二、演示这一过程

    1、数据库中增加商品表

    CREATE TABLE product(    id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',    name VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称',    price INT(11) DEFAULT 0 COMMENT '价格',    version INT(11) DEFAULT 0 COMMENT '乐观锁版本号',    PRIMARY KEY (id));INSERT INTO product (id, NAME, price) VALUES (1, '笔记本', 100);

    2、创建实体类

    @Datapublic class Product {    private Long id;    private String name;    private Integer price;    private Integer version;}

    3、创建Mapper

    public interface ProductMapper extends BaseMapper<Product> {    }

    4、进行测试

    @RunWith(springRunner.class)@SpringBootTestpublic class ProductVersionTest {@Resourceprivate ProductMapper productMapper;@Testpublic void testProductUpdate() {    //1、小李    Product p1 = productMapper.selectById(1L);    //2、小王    Product p2 = productMapper.selectById(1L);    //3、小李将价格加了50元,存入了数据库    p1.setPrice(p1.getPrice() + 50);    int result1 = productMapper.updateById(p1);    System.out.println("小李修改结果:" + result1);    //4、小王将商品减了30元,存入了数据库    p2.setPrice(p2.getPrice() - 30);    int result2 = productMapper.updateById(p2);    System.out.println("小王修改结果:" + result2);    //最后的结果    Product p3 = productMapper.selectById(1L);    System.out.println("最后的结果:" + p3.getPrice());}}

    最后输出的是 70元,与经理预期的120元不同,导致亏损,如何防止这样的异常发生,解决方案是使用乐观锁

    三、乐观锁方案

    数据库中添加version字段:取出记录时,获取当前version

    SELECT id,`name`,price,`version` FROM product WHERE id=1

    更新时,version + 1,如果where语句中的version版本不对,则更新失败

    UPDATE product SET price=price+50, `version`=`version` + 1 WHERE id=1 AND `version`=1

    四、乐观锁实现流程

    1、修改实体类

    添加 @Version 注解

    @Versionprivate Integer version;

    2、添加乐观锁插件

    @Configuration//@MapperScan("com.koo.modules.*.dao")public class MybatisPlusConfig {        @Bean    public MybatisPlusInterceptor mybatisPlusInterceptor() {        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));        //实现乐观锁,保证数据的准确性        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());        return interceptor;    }    @Bean    public ConfigurationCustomizer configurationCustomizer() {        return configuration -> configuration.setUseDeprecatedExecutor(false);    }}

    3、优化流程

    (判断第二次更新数据是否成功,不成功则重新取数据进行更新)

    @RunWith(SpringRunner.class)@SpringBootTestpublic class ProductVersionTest {@Resourceprivate ProductMapper productMapper;@Testpublic void testProductUpdate() {    //1、小李    Product p1 = productMapper.selectById(1L);    //2、小王    Product p2 = productMapper.selectById(1L);    //3、小李将价格加了50元,存入了数据库    p1.setPrice(p1.getPrice() + 50);    int result1 = productMapper.updateById(p1);    System.out.println("小李修改结果:" + result1);    //4、小王将商品减了30元,存入了数据库    p2.setPrice(p2.getPrice() - 30);    int result2 = productMapper.updateById(p2);    System.out.println("小王修改结果:" + result2);if(result2 == 0){//更新失败,重试    System.out.println("小王重试");    //重新获取数据    p2 = productMapper.selectById(1L);    //更新    p2.setPrice(p2.getPrice() - 30);    productMapper.updateById(p2);}    //最后的结果    Product p3 = productMapper.selectById(1L);    System.out.println("最后的结果:" + p3.getPrice());}}

    输出结果为120,数据正确

    以上就是“怎么使用MyBatisPlus+SpringBoot实现乐观锁功能”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

    --结束END--

    本文标题: 怎么使用MyBatisPlus+SpringBoot实现乐观锁功能

    本文链接: https://www.lsjlt.com/news/353183.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 怎么使用MyBatisPlus+SpringBoot实现乐观锁功能
      今天小编给大家分享一下怎么使用MyBatisPlus+SpringBoot实现乐观锁功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
      99+
      2023-07-05
    • MyBatisPlus+SpringBoot实现乐观锁功能详细流程
      目录一、商城数据不一致的场景二、演示这一过程1、数据库中增加商品表2、创建实体类3、创建Mapper4、进行测试三、乐观锁方案四、乐观锁实现流程1、修改实体类2、添加乐观锁插件3、优...
      99+
      2023-03-24
      springboot乐观锁 mybatisplus乐观锁 java 乐观锁
    • 悲观锁与乐观锁怎么利用Hibernate实现
      这篇文章将为大家详细讲解有关悲观锁与乐观锁怎么利用Hibernate实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。四种隔离机制不要忘记:(1,2,4,8)1.read-uncommitt...
      99+
      2023-05-31
      hibernate 悲观锁 乐观锁
    • redis乐观锁与悲观锁怎么使用
      本篇内容主要讲解“redis乐观锁与悲观锁怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis乐观锁与悲观锁怎么使用”吧!概念Redis是一个内存中的键值存储系统,支持多种数据结构,...
      99+
      2023-07-06
    • MyBatis中怎么实现乐观锁
      在MyBatis中实现乐观锁可以通过在对应的实体类中添加一个版本号字段,并在对应的更新操作中更新这个版本号字段。具体步骤如下: 在...
      99+
      2024-03-07
      MyBatis
    • 悲观锁与乐观锁怎么在Mysql中使用
      悲观锁与乐观锁怎么在Mysql中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。悲观锁悲观锁,认为数据是悲观的。当我们查询数据的时候加上...
      99+
      2024-04-02
    • mysql乐观锁怎么用
      非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
      99+
      2024-05-30
    • java乐观锁怎么应用
      在 Java 中,乐观锁通常通过版本号或时间戳来实现。下面是一种常见的应用乐观锁的方式: 定义一个对象,其中包含要被保护的共享数据...
      99+
      2023-10-25
      java
    • JAVA怎么实现乐观锁及CAS机制
      本篇内容介绍了“JAVA怎么实现乐观锁及CAS机制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言生活中我们看待一个事物总有不同的态度,比...
      99+
      2023-07-04
    • 【MySQl】MySQl中的乐观锁是怎么实现的
      文章目录 前言一、乐观锁二、如何实现乐观锁呢,一般来说有以下2种方式2.1、使用数据版本(Version)记录机制实现2.2、乐观锁定的第二种实现方式和第一种差不多 前言 mysql中...
      99+
      2023-09-20
      mysql oracle 数据库
    • Redis中如何使用Watch命令实现乐观锁
      在Redis中使用Watch命令实现乐观锁的步骤如下: 使用MULTI命令开启事务。 使用WATCH命令监视一个或多个指定的键。 ...
      99+
      2024-05-07
      Redis
    • 基于redis乐观锁怎么实现并发排队
      这篇“基于redis乐观锁怎么实现并发排队”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于redis乐观锁怎么实现并发排队...
      99+
      2023-07-04
    • java乐观锁实现的方法是什么
      在Java中,乐观锁的实现方法可以通过使用版本号机制来实现。具体步骤如下:1. 在数据表中添加一个版本号字段,通常为一个整数类型的字...
      99+
      2023-10-11
      java
    • SpringBoot整合MybatisPlus实现增删改查功能
      目录1.概述2.引入依赖3.配置连接信息4.新建两个表5.在项目中创建相应的实体类5.1 创建基础实体类5.2 SysDictType实体类5.3 SysDictData实...
      99+
      2024-04-02
    • Redis怎么使用乐观锁保证数据一致性
      这篇文章主要介绍了Redis怎么使用乐观锁保证数据一致性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。场景在 Redis 中经常会存在这么一种情况,读取某一个 key 的值,...
      99+
      2023-06-29
    • mongodb悲观锁怎么实现
      MongoDB是一个不支持悲观锁的数据库,它更倾向于使用乐观锁的方式来处理并发访问冲突。 乐观锁的实现方式如下: 在文档中添加一个...
      99+
      2023-10-26
      mongodb
    • 使用JavaScript怎么实现自动锁屏功能
      这篇文章将为大家详细讲解有关使用JavaScript怎么实现自动锁屏功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.使用场景有这么一个需求,开发了一套系统,当用户离开桌面或者一段时间不...
      99+
      2023-06-15
    • java使用JMF实现音乐播放功能
             JMF实际上是Java的一个类包。JMF 2.1.1技术提供了先进的媒体处理能力,从而扩展了Java平台的功能。这些功能包括:媒体捕获、压缩、流转、回放,以及对各种主...
      99+
      2023-05-31
      java jmf 音乐播放
    • 怎么使用Python实现windows倒计时锁屏功能
      这篇文章主要介绍了怎么使用Python实现windows倒计时锁屏功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Python实现windows倒计时锁屏功能文章都会有所收获,下面我们一起来看看吧。实...
      99+
      2023-07-06
    • 使用canvas怎么实现一个手势解锁功能
      使用canvas怎么实现一个手势解锁功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。手势解锁通过手指将屏幕上的九个点依次连接起来形成一个图案,所以叫图案解锁。...
      99+
      2023-06-09
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作