• mybatisplus----CRUD操作之更新操作(乐观锁)


    乐观锁


    在面试过程中,我们经常会被问到乐观锁,悲观锁!这个其实非常简单!


    乐观锁:故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,再次更新值测试。

    悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!

    当要更新一条记录的时候,希望这条记录没有被别人更新
    乐观锁实现方式:

    • 取出记录时,获取当前version
    • 更新时,带上这个version
    • 执行更新时, set version = newVersion where version = oldVersion
    • 如果version不对,就更新失败

    简单解释:

    乐观锁:1、先查询,获得版本号version =1
    --A线程

    update user set name ="kuangshen",version = version +1
    where id = 2 and version = 1


    --B线程抢先完成,这个时候version =2,会导致A修改失败!
    update user set name ="kuangshen",version = version +1
    where id =2 and version =1

    测试一下MP的乐观锁插件

    1、给数据库中增加version字段!

     2、我们实体类加对应的字段

    @Version//乐观锁Version注解
    private Integer version;

    3,注册组件:

    package com.config;
    
    import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    @MapperScan("com.hui.mapper")//把扫描mapper接口的注解移动到这个配置类上面
    @EnableTransactionManagement//事务注解默认开启
    @Configuration//配置类
    public class MybatisplusConfig {
    
        //注册乐观锁插件
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }
    
    
    }

    4.测试:

    乐观锁的情况下正常更新成功的情况:

        //测试乐观锁成功
        @Test
        void testOptimisticLocker(){
    
            User user = userMapper.selectById(5L);
            Integer version = user.getVersion();
            System.out.println("第一次查询封装到user中的版本是:"+version);
            //接下来进项修改
            user.setAge(23);
            user.setName("本杰明");
            userMapper.updateById(user);
    
        }

    结果成功:

    测试乐观锁失败的情况:

        //测试乐观锁失败
        @Test
        void testOptimisticLocker2() {
    
            User user1 = userMapper.selectById(1L);
            user1.setName("瓜瓜");
            //接下来这个操作模拟线程2的操作
            User user2 = userMapper.selectById(1L);
            user2.setName("瓜瓜2");
            userMapper.updateById(user2);//这个时候version就会更新成2
            //然后下面的user的更新操作因为版本还停留在1,所以会更新失败
            userMapper.updateById(user1);
            //所以最后版本是2,名字是瓜瓜2
    
    
        }

     

     数据库中的结果:

     

    迎风少年
  • 相关阅读:
    网曝!互联网公司那些老司机才懂的秘密~~
    中国IT行业薪资:与销售相比,程序员真得很“穷”
    太简单了,教你去掉Java代码中烦人的“!=null”
    怎么判断自己在不在一家好公司?
    内部泄露版!互联网大厂的薪资和职级一览
    重磅!GitHub突然宣布,对全球人免费开放全部核心功能
    痛心!Pandownload开发者被抓!我终于决定使用Docker搭建一个多端同步网盘!
    退税:我承认我有赌的成分
    golang实现的简单优先队列
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)解答
  • 原文地址:https://www.cnblogs.com/ZYH-coder0927/p/13969227.html
Copyright © 2020-2023  润新知