乐观锁
主要解决: 丢失更新
如果不考虑事物隔离性:
产生读问题: 脏读 不可重复读 幻读
写问题: 丢失更新问题
解决方案:
悲观锁: 只允许一人操作,串行
乐观锁: 取出记录时,获取当前 version
更新时,带上这个 version
执行更新时,set version = newVersion where version = oldversion
version发生变化
如果version不对,就更新失败
乐观锁具体实现:
1.表添加字段,作为乐观锁版本号
2.对应实体类添加版本号属性
在 User 实体类中,设置 version 注解,并且 自动填充
@Data
public class User {
@TableField(fill = FieldFill.INSERT)
@Version
private Integer version;
}
@Component
public class ObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("version",2,metaObject);
}
}
另写一个配置类 Myconfig
@Configuration
@MapperScan("com.lsr.mapper")
public class MyConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
测试
@Test
public void testOptimisticLocker() {
// 先查找
User user = userMapper.selectById(1371293888823787523L);
// 后修改
user.setNam("iqh");
int r = userMapper.updateById(user);
System.out.println(r);
}
执行的sql语句:
先通过 id 查找获得 version值
SELECT id,create_time,update_time,nam,age,email,version FROM user WHERE id=?
根据 id 值和version值来更新数据
UPDATE user SET create_time=?, update_time=?, nam=?, age=?, email=?, version=? WHERE id=? AND version=?