MyBatis中乐观锁插件和分页插件的使用

目录:

乐观锁插件使用

第一:什么是乐观锁

第二:为什么需要锁(并发控制)

第三:乐观锁使用MyBatisPlus的解决方式

分页插件的使用

第一步:插件搞里头

第二步:new Page 搞里头

性能测试插件

第一:在MyBatisPlusConfig中设置

第二:在springboot的yml中设置当前环境


乐观锁插件使用

第一:什么是乐观锁

乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

  • 悲观锁:指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。(例子:相当于电路中的串行。在全国人民看新闻联播的时候只能一个人看,我看完了你们下一个人才能看)
  • 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。

第二:为什么需要锁(并发控制)

在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题

  • 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户1把值从500改为8000,用户B把值从500改为200,则多人同时提交同一条记录,后提交的把之前的提交数据覆盖。
  • 脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读。例如:用户A,B看到的值都是500,用户B把值改为200,用户A读到的值仍为500。

针对一种问题的解决方案,为解决问题而生的。解决什么问题呢?主要是解决丢失更新问题如下图理解

MyBatis中乐观锁插件和分页插件的使用_第1张图片

为了解决这些并发带来的问题。 我们需要引入并发控制机制。

第三:乐观锁使用MyBatisPlus的解决方式

由于锁这个字眼我们需要在数据库加个字段“version”来控制版本

在类中加个属性

@Version   //这就是控制版本的
@TableField(fill = FieldFill.INSERT)    //这个方便在添加的时候设置版本初始为1
private  Integer version;    //版本的字段

 下面这个也是MyBatisPlus的一个插件   只需要实现MetaObjectHandler就可以了

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
//这里的“version”就是指定的字段,设置初始值为1,之后每修改一次+1
        this.setFieldValByName("version",1,metaObject);   
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        
    }
}

 在MyBatis中存在一个乐观锁插件: OptimisticLockerInnerInterceptor

@Configuration
@MapperScan("com.lzz.mapper")
public class MyConfig {
    //乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

接下来在做增加数据的时候,调用insert添加方法就可以了。

修改的时候呢,我们需要先查人后再做修改,因为我们为了防止问题的发生,需要先去查询版本号比对才进行后续操作!!

分页插件的使用

第一步:插件搞里头

@Configuration
@MapperScan("com.lzz.mapper")
public class MyConfig {
    //分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

第二步:new Page 搞里头

    @Test
    public void  testPage(){
        Page page = new Page<>(1, 3);
        userMapper.selectPage(page,null);
        System.out.println(page.getCurrent()); //当前页
        System.out.println(page.getRecords());//每页的List集合数据
        System.out.println(page.getSize());//每页显示记录的数
        System.out.println(page.getTotal()); //总页数
        System.out.println(page.getPages());//总也是

        System.out.println(page.hasNext()); //下一页.如果有下一页就true,反之false
        System.out.println(page.hasPrevious()); //下一页.如果有上一页就true,反之false
    }

性能分析插件

根据这个插件能测试出自己的sql性能如何

第一:在MyBatisPlusConfig中设置

//  性能测试插件
    //  开发环境测试,线上不推荐,maxTime指的是 sql 执行最大时长
    @Bean
    @Profile({"dev","test"})
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor pi=new PerformanceInterceptor();
        pi.setMaxTime(100);  //最大毫秒数,超出此时间那么sql不执行
        pi.setFormat(true);
        return pi;
    }

第二:在springboot的yml中设置当前环境

#环境设置:dev开发环境、test测试环境、prod生产环境
spring.profiles.active=dev

 

 

你可能感兴趣的:(mybatis)