丢失更新
- 如果不考虑事务的隔离性,会产生两类问题
- 读的问题:脏读 不可重复读 幻读
- 写的问题:丢失更新(多个人同时修改同一条记录,谁最后提交,会把之前提交的数据覆盖)
- 丢失更新例子
id money
1 500
lucy mary
开始事务 开始事务
500 -> 8000 500 -> 200
首先提交事务 之后提交事务
某天lucy回来看,工资明明改成了8000,为什么变成了200
丢失更新解决方案
- 悲观锁
lucy在操作数据时,别人都不能操作,只有等她操作完成之后,别人才可以操作(串行操作) - 乐观锁
id money version
1 500 1
通过版本号进行控制,比较当前版本和数据库中的版本是否一样,一样才能修改,每次修改后版本号+1
mary刚开始获取的版本号是1,lucy提交后版本号变为2,这时mary再提交修改就会失效
- 数据库中添加version字段,表示版本号
- 元对象处理器接口添加version的insert默认值
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("version", 1, metaObject);
}
}
- 实体类中添加version字段,并添加@Version注解
@Version
@TableId(fill = FieldFill.INSERT)
private Integer version;
- 在配置类中配置乐观锁插件
@Configuration
@MapperScan("com.atguigu.mybatis_plus.mapper")
public class EduConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}