乐观锁假设数据一般情况不会造成冲突,只有在数据进行提交更新的时候,才会对数据的冲突与否进行检测;
乐观锁适用于读多写少的场景,这样可以提高程序的吞吐量;
通俗地说就是:当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
1.取出记录时,获取当前version;
2.更新时,带上这个version(只要记录被更新,version+1);
3.执行更新时, set version = newVersion where version = oldVersion;
4.如果version不对,就更新失败
1.数据库表新增version字段
2.表对应实体类新增version属性
@Version //代表是乐观锁
private Integer version;
3.配置插件(在配置类中注册组件) 大公告成
@EnableTransactionManagement //开启事务管理
@Configuration
public class MybatisConfig {
//注册乐观锁
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
4.模拟
@Test
void testOptimisticLocker2(){
//查询用户信息(先拿到version,只要被更新一次version就会加一)
User user = userService.getById(1L); //version=2 ----user
user.setName("第一次");
//模拟多线程抢占
User user1 = userService.getById(1L); //version=2(数据库中version=2) -----user1
user1.setName("第二次");
userService.updateById(user1); //version=3(数据库中version=3) -----user1
userService.updateById(user); //version=2 --user(数据库中version=3) 不匹配 更新失败
}



