MyBatis-Plus入门(四):乐观锁及简单应用

本文详细介绍了如何在MyBatis-Plus中实现乐观锁,以解决并发场景下的数据冲突问题。通过添加版本字段、配置乐观锁插件以及自动填充版本号,确保了数据的一致性。在测试中展示了乐观锁如何防止更新丢失,使得多个用户在并发操作时能正确处理数据版本。
摘要由CSDN通过智能技术生成

先来看以下场景:
在这里插入图片描述
假设张三和李四都可以对某条记录进行操作,原始记录为(sex,age) = (‘male’, 25)。但在张三正在查询和修改数据时,李四率先完成了修改。所以张三提交时会导致李四的更新丢失,而张三却并不知情。
为了避免造成这种情况发生,MyBatis-Plus为我们实现了版本控制。
版本控制,顾名思义,就是在修改完数据时会更新一次数据的版本。如果读取时的版本和修改时的版本不一致,就不能执行更新操作。
如张三首先读到的 记录为(‘male’, 25),这是版本1。李四读取并修改为(‘male’, 30),此时该记录的版本变为2,而张三想要更新时发现最新版本与读取时版本不一致,那么就不能更新该记录。
这就是“乐观锁”的思想,版本控制是实现“乐观锁”最常用的方法。
乐观锁实现方式:
1、取出记录时,获取当前version
2、更新时,带上这个version
3、执行更新时, set version = newVersion where version = oldVersion
4、如果version不对,就更新失败

接下来介绍如何在Mybatis-Plus项目中,使用乐观锁:

1、修改实体类,添加version字段

@Version
private Integer version;

2、创建配置文件

创建包config,创建文件MybatisPlusConfig.java
此时可以删除主类中的 @MapperScan 扫描注解

@Configuration
@MapperScan("com.smallorange.mapper")
public class MybatisPlusConfig {
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

}

3、注册乐观锁插件

MP版本在3.3.x及以下的写法如下:

/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
    return new OptimisticLockerInterceptor();
}

3.4及以上的写法如下:

    @Bean 
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        // mp插件接口
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }

并在MyMetaObjectHandler中的insertFill()方法中添加自动填充

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始创建时间字段...");
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("version",1,metaObject);//记录的起始版本为1
    }

4.测试

首先给数据库添加一条新记录

   @Test
    public void testAdd() {
        User user = new User();
        user.setName("SmallOrange");
        user.setAge(22);
        user.setEmail("1719302525@qq.com");
        int insert = userMapper.insert(user);
        System.out.println(insert);
    }

插入成功,版本号自动填充为1
在这里插入图片描述

接着修改该条记录时,MP会自动将版本号加1,无需通过手动的方式用getVersion()方法得到version值再加1改版本号。

   @Test
    public void updateUser(){
        User user = userMapper.selectById(35L);
        user.setName("BigOrange");
        int count=userMapper.updateById(user);
        System.out.println(count);
    }

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值