乐观锁

乐观锁

在面试过程中,我们经常会被问道乐观锁,悲观锁!这个其实非常简单!

乐观锁 : 故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题, 再次更新值测试
悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!

乐观锁实现方式:
  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

测试mybatisplus的乐观锁

  • 添加字段version 默认值为1

  • 同步实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @Version //乐观锁的注解
    private int version;
    // 自动填充内容
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}
  • 配置乐观锁
@EnableTransactionManagement
@Configuration
public class MybatusPlusCOnfig {
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}
  • 测试乐观锁成功案例
//测试乐观锁成功
@Test
public void testOptimLock(){
    User user = mapper.selectById(1L);
    user.setAge(100);
    user.setName("123");
    mapper.updateById(user);
}
  • 失败案例
//测试乐观锁失败(多线程下)
@Test
public void testOptimLock1(){
    User user = mapper.selectById(1L);
    user.setAge(100);
    user.setName("one");

    //第二条数据
    User user1 = mapper.selectById(1L);
    user1.setAge(101);
    user1.setName("two");
    mapper.updateById(user1);

    mapper.updateById(user);
}
//结果:只能更新user1的数据
posted @ 2021-07-29 15:51  saxon宋  阅读(113)  评论(0)    收藏  举报