乐观锁
在面试过程中,我们经常被问道乐观锁,悲观锁!这个其实非常简单!
乐观锁:顾名思义十分乐观,他总是认为不会出现问题,无论干什么不去上锁!如果出现问题,再次更新值测试
悲观锁:顾名思义十分悲观,他总是认为总是出现问题,无论干什么都会上锁!再去操作
我们这里主要讲解 乐观锁 机制!
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
乐观锁:1、先查询,获得版本号 version = 1
-- A
update user set name = "haoran",version = version + 1
where id = 2 and version = 1
-- B 线程抢先完成,这个时候 version = 2,会导致A 修改失败
update user set name = "haoran",version = version + 1
where id = 2 and version = 1
测试一下Mybatis Plus的乐观锁插件
1、给数据库增加version字段!
2、我们实体类加对应的字段
@Version //乐观锁Version的注解
private Integer version;
3、注册组件
@MapperScan("com.zheng.mapper") //扫描 mapper 文件夹
@EnableTransactionManagement
@Configuration //配置类
public class MyBatisPlusConfig {
// 注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
4、测试一下
//测试乐观锁成功!
@Test
public void testOptimisticLocker(){
// 1、查询用户信息
User user = userMapper.selectById(1L);
// 2、修改用户信息
user.setName("haoran");
user.setEmail("Haor1250outlook.com");
// 3、执行更新操作
userMapper.updateById(user);
}
// 测试乐观锁失败! 多线程下
@Test
public void testOptimisticLocker2(){
//线程1
User user = userMapper.selectById(1L);
user.setName("haoran111");
user.setEmail("Haor1250outlook.com");
// 模拟另外一个线程执行了插队操作
User user2 = userMapper.selectById(1L);
user.setName("kuang222");
user.setEmail("Haor1250outlook.com");
userMapper.updateById(user2);
// 自旋锁来多次尝试提交
userMapper.updateById(user); //如果没有乐观锁就会覆盖插队线程的值
}
分页查询
分页在网站使用的十分之多!
1、原始的 limit 进行分页
2、pageHelper 第三方插件
3、MybatisPlus 其实也内置了分页插件
如何使用!
1、配置拦截器组件
//分页插件
@Beanpublic PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
2、直接使用Page对象即可!
//测试分页查询
@Test
public void testPage(){
// 参数一:当前页
// 参数二:页面大小
// 使用了分页插件之后,所有的分页操作变得简单!
Page<User> page = new Page<>(2,5);
userMapper.selectPage(page,null);
page.getRecords().forEach(System.out::println);
System.out.println(page.getTotal());
}