本文代码样例均已上传至Gitee:https://gitee.com/tqbx/springboot-samples-learn/tree/master/spring-boot-mybatis-plus-primer
乐观锁适用于读多写少的场景。
乐观锁的实现机制:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果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
不能复用!!!
- 配置乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
- 测试,为更新的实体设置期望的版本号:
@Test
void update() {
//PDATE user SET name=?, update_time=?, version=? WHERE id=?
// AND version=? AND deleted=0
int version = 2;
User user = new User();
user.setId(1320037517763842049L);
user.setName("sm2");
user.setVersion(version);//期望的版本号
boolean b = userService.updateById(user);
System.out.println(b);
}