MP实现乐观锁
乐观锁:默认在任何操作影响下,都不会影响该操作
乐观锁主要解决丢失更新问题
面试题:
什么是并发?
至少两人以上同时对这个事务操作
不考虑事务隔离性,会产生哪些读的问题?
脏读、幻读、不可重复读
不考虑事务隔离性,会产生哪些写的问题?
丢失更新
图片上是工资条,假如Lucy和Mary都想对工资条进行操作,lucy想改工资,Mary也想改,不可能两人同时提交,lucy先提交事务,Mary后提交事务,那么lucy会丢失更新,结果为Mary的修改值。这就是丢失更新
解决方式:悲观锁 乐观锁
悲观锁:只能一个人操作,别人只能看着。串行操作,单线程。
乐观锁:给定一个版本号,用户操作时比较当前版本和数据库版本是否一致,更新数据时要连着版本号一起更新。
(另外,在redis解决高并发也有redis分布锁,使用synchronized,为什么要使用synchronized?
在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。
关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,使用redis的setnx命令,可以简单的解决集群下的分布式锁问题)
在MP中实现乐观锁
1.在数据库创建一个version字段,
2.在User类里面加一个version属性,属性上加一个@Version注解,
3.配置乐观锁插件
在MP中,使用@Configuration注解配置类,将所有配置类写到一起
创建一个config类,将启动类中的@MapperScan 移动到config里。
/** * 乐观锁插件 */@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}
然后在test里,新建一个用户,再新建test测试乐观锁,先使用
User user =userMapper.selectById(1558704593221742594L) ;
查找到对应的用户,再setAge改变年龄,最后userMapper.UpdateById(user)。结果是版本号更新了
MP简单查询
1.根据id查询
SelectById()
2.多个id批量查询
List users =UserMapper.SelectBatchIds(Arrays.asList(1L,2L,3L)
3.简单条件查询
SelectByMap
4.分页查询
(1)配置分页插件,也放到之前的config类里面
/** 分页插件*/@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
(2)编写分页代码,传入两个参数,当前页和记录数
Pagepage=new Page(1,3)
UserMapper.SelectPage(page,null)
(3)通过page获取分页数据