Mybatis Plus乐观锁插件配置和使用
乐观锁插件
主要适用场景
意图:
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前
version
- 更新时,带上这个
version
- 执行更新时,
set version = newVersion where version = oldVersion
- 如果
version
不对,就更新失败
第一步:首先需要在表中添加version
字段,做为乐观锁的版本号
第二步:对应的实体类要添加(version字段
)版本号属性和@Version
注解
/**
* 版本号
*/
@Version
private Integer version;
`特别说明:
- 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
- 整数类型下
newVersion = oldVersion + 1
newVersion
会回写到entity
中- 仅支持
updateById(id)
与update(entity, wrapper)
方法 - 在
update(entity, wrapper)
方法下,wrapper
不能复用!!!`
第三步:创建Mybatis Plus
配置类,启动时加载配置
/**
* <p>
* Description: Mybatis-plus配置类
* </p>
*
* @author songzixian
* @version v1.0.0
* @create 2020-05-13 16:52
* @see com.songzixian.config
*/
@EnableTransactionManagement
@Configuration
@MapperScan("com.songzixian.mapper") //在这里添加了,启动类就不需要添加了,因为作用是一样的
public class MpConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
在MyMetaObjectHandler
类insertFill
方法添加上下面这段代码,可以每次增加数据时version
默认数据为1
(可省略,非必须)
//乐观锁配置
this.setFieldValByName("version",1,metaObject);
测试:注意 使用乐观锁时需要先查询然后再修改才生效,去数据库对version自动看看每次修改有没有自增
/**
* 乐观锁修改数据成功测试
*/
@RequestMapping("optimisticLock")
@ResponseBody
public String optimisticLock(Long id){
User user = userMapper.selectById(id);
user.setName("szxblog");
userMapper.updateById(user);
return "修改成功";
}
测试后分析打印的sql语句,每次修改都将version的数值进行了加1操作
乐观锁修改失败测试
/**
* 乐观锁失败
*/
@RequestMapping("optimisticLockdefeated")
@ResponseBody
public String optimisticLockdefeated(Long id){
//根据id查询
User user = userMapper.selectById(id);
//修改用户 无效
user.setName("宋子宪博客");
user.setAge(23);
//模拟取出数据后,数据库中version实际数据比取出的值大,即已被其它线程修改并更新了version
user.setVersion(user.getVersion() - 1);
//会发现修改
userMapper.updateById(user);
return "修改成功";
}
到这里乐观锁插件就配置和使用成功了
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »