本文代碼樣例均已上傳至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);
}