欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-24 16:27:58
...

目录:

乐观锁插件使用

第一:什么是乐观锁

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

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

分页插件的使用

第一步:插件搞里头

第二步:new Page 搞里头

性能测试插件

第一:在MyBatisPlusConfig中设置

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


乐观锁插件使用

第一:什么是乐观锁

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

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

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

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

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

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

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

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

第三:乐观锁使用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<User> 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

上一篇: Lombok插件和@Data注解

下一篇: