丢失更新问题
两个用户同时操作同一条数据,最后提交的数据会覆盖上一次提交的,这就是丢失更新问题
解决这个问题,有悲观锁(串行)与乐观锁等方法
乐观锁
乐观锁实现线程安全的数据更新,每次更新数据先比较版本号,版本号相同才可以操作,操作完成版本号+1
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
乐观锁实现步骤
- 在数据库中添加version字段
- 在实体类中添加version属性,并加上注解@Version
- 在配置类中配置乐观锁插件
(1)实体类添加属性
//添加版本号实现乐观锁
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
(2)自动填充设置默认值
@Component
public class MyObjectHandler implements MetaObjectHandler {
//MP添加时执行
@Override
public void insertFill(MetaObject metaObject) {
......
//设置version默认值为1
this.setFieldValByName("version",1,metaObject);
}
}
(3)乐观锁插件
@Configuration
public class MyBatisPlusConfig {
//乐观锁拦截器
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
(4)测试
@Test
void insertTest(){
User user = new User();
user.setName("乐观锁测试");
user.setAge(20);
user.setEmail("123@qq.com");
userMapper.insert(user);
}
@Test
void OptimisticLockerTest(){
User user = userMapper.selectById(1517029650881130501L);
user.setAge(80);
userMapper.updateById(user);
}