在面试过程中,乐观锁、悲观锁经常被提问
乐观锁: 顾名思义十分乐观,它总是认为不会出现问题,无论干什么都不去上锁,如果出现了问题,再次更新值测试
悲观锁:顾名思义十分悲观,他总是认为会出现问题,无论干什么都会上锁,再去操作
乐观锁实现方式:
- 取出记录时,获取当前 version
- 更新时,带上这个 version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果 version 不对,就更新失败
乐观锁:1、先查询,获得版本号 version = 1-- Aupdate user set name = "cedric",version = version + 1where id = 2 and version = 1-- B 线程抢先完成,这个时候 version = 2,会导致 A 修改失败update user set name = 'cedric',version = version + 1where id = 2 and version = 1
测试MyBatisPlus的乐观锁插件
1、给数据库中增加version字段
2、实体类增加对应的字段
@Version //乐观锁Version注解private Integer version;
3、注册组件
// 扫描Mapper文件夹@MapperScan("com.cedric.mybatisplus.mapper")@EnableTransactionManagement@Configurationpublic class MyBatisPlusConfig {// 注册乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}}
4、测试一下
// 测试乐观锁成功@Testpublic void testOptimisticLocker(){// 1.查询用户信息User user = userMapper.selectById(1L);// 2.修改用户信息user.setName("张三");user.setEmail("zhangsan@sina.cn");// 3.执行更新操作userMapper.updateById(user);}// 测试乐观锁失败(多线程下)@Testpublic void testOptimisticLocker2(){// 线程1User user = userMapper.selectById(1L);user.setName("张三11111");user.setEmail("zhangsan@sina.cn");// 模拟另一个线程执行了插队操作User user2 = userMapper.selectById(1L);user2.setName("张三2222");user2.setEmail("zhangsan@qq.com");userMapper.updateById(user2);userMapper.updateById(user); //如果没有乐观锁就会覆盖插队线程的值}

