Mybatis-Plus乐观锁

举报
酸菜鱼. 发表于 2022/07/24 20:35:53 2022/07/24
【摘要】 Mybatis-Plus乐观锁知识的介绍

🍺实现乐观锁

在我们进行大项目的开发时,访问数据时不可能串行(one by one)地进行的,但如果多个人同时修改一个数据,可能最后一个数据会将前面的数据覆盖掉,因此能够使用乐观锁而不是悲观锁,Mybatis-Plus会基于版本号这样做:

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

接下来我们来实现。

在这里插入图片描述

首先还是在实体类和数据库中定义新字段:

ALTER TABLE `user` ADD COLUMN `version` INT

在实体类中需要为版本号加上@Version注解,表示这个字段是版本号。

@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;

同时加上@TableField注解,在新增时定义版本号的默认值。
在handler类中配置

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);//根据名字设置属性值
        this.setFieldValByName("updateTime",new Date(),metaObject);
        this.setFieldValByName("version",1,metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

同时也需要在configuration配置类中进行配置

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement //开启事务注解
@Configuration
@MapperScan("com.atguigu.mybatis_plus.mapper")
public class MybatisPlusConfig {
    /**
     * 乐观锁插件
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

编写添加用户数据和更新用户数据的类

//增加用户数据测试类
   @Test
    public void insertUser(){
        System.out.println(("----- insert method test ------"));
        User user=new User();
        user.setName("wangWu");
        user.setId(8L);
        user.setAge(21);

//        user.setCreateTime(new Date());
//        user.setUpdateTime(new Date());
        user.setEmail("wangWU@qq.com");
        int result = userMapper.insert(user);
        System.out.println(result);
    }
    
编写更新数据测试类

    @Test
    public void testOptimisticLocker(){
        User user=userMapper.selectById(8L);//必须先查询获取version的值,然后再修改,version值才会有变化

        user.setAge(20);
        int i = userMapper.updateById(user);
        System.out.println(i);
    }

需要注意的是:一定要先查询对象的version值,才生效!如果直接进行updateById的话不会生效。

测试结果如下:

添加用户,version值为1
在这里插入图片描述
修改用户age为21,此时version+1变为了2。
在这里插入图片描述

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。