mp中的乐观锁

发布时间:2024年01月19日

乐观锁:通过版本号控制并发问题

当要更新一条记录的时候,希望这条记录没有被别人更新

乐观锁实现方式:

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

????????更新时,带上这个version

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

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

(1)数据库表中添加version字段,作为乐观锁版本号

(2)? 对应实体类添加version字段,即版本号属性,在实体类版本号属性添加注解

spring boot 注解方式:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    return interceptor;
}

创建一个包config,包中创建一个配置类 MpConfig,添加Configuration注解,把启动类中的mapperScan注解也可移到配置类中来

// Spring Boot 方式
@Configuration
@MapperScan("按需修改")
public class MybatisPlusConfig {
    /**
     * 旧版
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    /**
     * 新版
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

测试乐观锁:先查询后修改

/**
* 测试 乐观锁插件
*/
@Test
public void testOptimisticLocker() {
//查询
User user = userMapper.selectById(1L);
//修改数据
user.setName("Helen Yao");
user.setEmail("helen@qq.com");
//执行更新
userMapper.updateById(user);
}
/**
* 测试乐观锁插件 失败
*/
@Test
public void testOptimisticLockerFail() {
//查询
User user = userMapper.selectById(1L);
//修改数据
user.setName("Helen Yao1");
user.setEmail("helen@qq.com1");
//模拟取出数据后,数据库中version实际数据比取出的值大,即已被其它线程修改并更新
了version
user.setVersion(user.getVersion() - 1);
//执行更新
userMapper.updateById(user);
}

文章来源:https://blog.csdn.net/m0_54397364/article/details/135692606
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。