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获取分页数据