Mybatis-Plus乐观锁
【摘要】 Mybatis-Plus乐观锁知识的介绍
🍺实现乐观锁
在我们进行大项目的开发时,访问数据时不可能串行(one by one)地进行的,但如果多个人同时修改一个数据,可能最后一个数据会将前面的数据覆盖掉,因此能够使用乐观锁而不是悲观锁,Mybatis-Plus会基于版本号这样做:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
接下来我们来实现。
首先还是在实体类和数据库中定义新字段:
ALTER TABLE `user` ADD COLUMN `version` INT
在实体类中需要为版本号加上@Version注解,表示这个字段是版本号。
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
同时加上@TableField注解,在新增时定义版本号的默认值。
在handler类中配置
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);//根据名字设置属性值
this.setFieldValByName("updateTime",new Date(),metaObject);
this.setFieldValByName("version",1,metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
同时也需要在configuration配置类中进行配置
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement //开启事务注解
@Configuration
@MapperScan("com.atguigu.mybatis_plus.mapper")
public class MybatisPlusConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
编写添加用户数据和更新用户数据的类
//增加用户数据测试类
@Test
public void insertUser(){
System.out.println(("----- insert method test ------"));
User user=new User();
user.setName("wangWu");
user.setId(8L);
user.setAge(21);
// user.setCreateTime(new Date());
// user.setUpdateTime(new Date());
user.setEmail("wangWU@qq.com");
int result = userMapper.insert(user);
System.out.println(result);
}
编写更新数据测试类
@Test
public void testOptimisticLocker(){
User user=userMapper.selectById(8L);//必须先查询获取version的值,然后再修改,version值才会有变化
user.setAge(20);
int i = userMapper.updateById(user);
System.out.println(i);
}
需要注意的是:一定要先查询对象的version值,才生效!如果直接进行updateById的话不会生效。
测试结果如下:
添加用户,version值为1
修改用户age为21,此时version+1变为了2。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)