乐观锁只要是为了解决数据库中写操作中的丢失更新问题,在多人同时修改同一数据的时候,最后提交的要将之前提交的覆盖掉,为了解决这个问题在此条记录中添加一个version的字段,对其进行修改的时候,同时改变version号,其他人想要修改这个记录的时候,因为此记录的version与它的version不匹配,所以不能修改,这样就解决了丢失更新的问题。
具体实现如下
1. 在表中添加version字段,作为乐观锁的版本号。
ALTER TABLE `user` ADD COLUMN `version` INT
2. 对应的实体类中添加版本号属性。
并添加注解@Version
当插入事件发生时,version自动填充1
@TableField(fill = FieldFill.INSERT)
this.setFieldValByName("version",1,metaObject);//当插入事件发生时,version自动填充1
@Version
@TableField(fill = FieldFill.INSERT)//事件发生时自动填充,
private Integer version;
3. 创建Config类
@MapperScan("com.zt.mpdemo01.mapper")//在每个mapper中添加注解@Mapper也行
@Configuration
public class MpConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
4. 测试
乐观锁必须先查询再修改,直接修改没有效果。
执行插入
后执行查询修改
/**
* 测试乐观锁
* 先查询再修改
*/
@Test
void testOpmisticLocker(){
User user=userMapper.selectById(1377518936832090113L);
user.setAge(1000);
userMapper.updateById(user);
}
version版本发生了改变!
测试乐观锁失败
/**
* 测试乐观锁失败
*/
@Test
void falsetestOpmisticLocker(){
//查询数据version+1
User user=userMapper.selectById(1L);
//修改数据
user.setName("test");
user.setAge(2000);
//测试版本与查询的不一样
user.setVersion(user.getVersion()-1);
//修改数据
userMapper.updateById(user);
}
结果第二次update的时候报错: