• mybatis-plus-乐观锁


    乐观锁:十分乐观。总是认为不会出现问题,无论干什么也不上锁,出了问题再次更新测试。

    悲观锁:十分悲观。总是认为会出问题,无论干什么都会上锁,再去操作。

    乐观锁实现方式:

    ·取出记录时,获取当前version

    ·更新时带上version

    ·执行更新时,set version=newVersion where version=oldVersion

    ·如果version不对,就更新失败

    如:

    --A
    update user set name="abc",version=version+1
    where id=2 and version =1
    
    --B  比A先完成更新,这时version=2会导致A修改失败
    update user set name="abc1",version=version+1
    where id=2 and version =1

    乐观锁插件:

    ①给数据库增加version字段

    ②实体类加对应字段

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

    ③注册组件 

    建一个配置类

    package com.example.demo.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;
    
    //扫描mapper文件夹
    @MapperScan("com.example.demo.mapper")
    @EnableTransactionManagement//开启事物
    @Configuration//配置类
    public class MyBatisPlusConfig {
        //注册乐观锁插件
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor(){
            return new OptimisticLockerInterceptor();
        }
    }

    ④测试

    成功:

    @Test
        public void testOptimisticLocker(){
            //查询用户信息
            User user = userMapper.selectById(1);
            //修改用户
            user.setName("abc");
            user.setEmail("abc@163.com");
            //执行更新操作
            userMapper.updateById(user);//UPDATE user SET name=?, age=?, email=?, update_time=?, version=? WHERE id=? AND version=? 
        }

    更新前

    更新后

     失败:

    //测试乐观锁失败!多线程
        @Test
        public void testOptimisticLocker2(){
            //线程1
            User user1 = userMapper.selectById(1);
            user1.setName("abc2");
            user1.setEmail("abc2@163.com");
    
            //线程2 模拟另外一个线程执行了插队操作
            User user2 = userMapper.selectById(1);
            user2.setName("abc1");
            user2.setEmail("abc1@163.com");
            //执行更新操作
            userMapper.updateById(user2);
            userMapper.updateById(user1);
        }

    更新前:

     更新后:

    所有博客均为自己学习的笔记。如有错误敬请理解。
  • 相关阅读:
    架构设计:系统存储(1)——块存储方案(1)
    《Linux设备节点创建》用户空间ueventd创建设备节点规则
    架构设计:系统间通信(45)——阶段性问题记录
    队列
    链栈
    顺序栈
    入栈问题
    队列
    数学表达式配对栈
    链表设置
  • 原文地址:https://www.cnblogs.com/tangtang-benben/p/14483351.html
Copyright © 2020-2023  润新知