乐观锁
乐观锁
在面试过程中,我们经常会被问道乐观锁,悲观锁!这个其实非常简单!
乐观锁 : 故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题, 再次更新值测试
悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!
乐观锁实现方式:
- 取出记录时,获取当前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的数据

浙公网安备 33010602011771号