丢失更新问题
两个用户同时操作同一条数据,最后提交的数据会覆盖上一次提交的,这就是丢失更新问题 解决这个问题,有悲观锁(串行)与乐观锁等方法
乐观锁
乐观锁实现线程安全的数据更新,每次更新数据先比较版本号,版本号相同才可以操作,操作完成版本号+1 乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
特别说明: (1)支持的数据类型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime (2)整数类型下 newVersion = oldVersion + 1 (3)newVersion 会回写到 entity 中 (4)仅支持 updateById(id) 与 update(entity, wrapper) 方法 (5)在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
乐观锁实现步骤
- 在数据库中添加version字段
- 在实体类中添加version属性,并加上注解@Version
- 在配置类中配置乐观锁插件
(1)实体类添加属性
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
(2)自动填充设置默认值
@Component
public class MyObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
......
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);
}
|