// 在 MyBatis-Plus 配置类中添加乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
// 实体类User添加版本号字段
public class User {
private Long id;
private String name;
@Version
private Integer version;
// 省略其他字段和方法
}
// 更新操作,自动使用乐观锁
User user = userService.getById(1L);
user.setName("张三丰");
boolean success = userService.updateById(user);
// 若更新失败(版本号不匹配),success 为 false
// 更新时检测到乐观锁冲突的处理
User user = userService.getById(1L);
user.setName("张三丰");
if (!userService.updateById(user)) {
// 重新获取数据并重试或者做其他冲突处理
}
// 在事务中使用乐观锁进行更新操作
@Transactional
public void updateUser(Long id, String newName) {
User user = userService.getById(id);
user.setName(newName);
if (!userService.updateById(user)) {
throw new OptimisticLockingFailureException("更新失败,数据可能已被修改");
}
}
// 批量更新用户信息,每个用户记录都应用乐观锁
List<User> users = userService.listByIds(userIds);
for (User user : users) {
user.setSomeField(newValue);
userService.updateById(user);
}
// 查询操作不受乐观锁影响
List<User> users = userService.list(new QueryWrapper<User>().lambda().eq(User::getName, "张三"));
// 在实体类中使用自定义的版本号字段
public class User {
private Long id;
private String name;
@Version
private Long customVersion;
// 省略其他字段和方法
}
// 删除操作不受乐观锁影响
boolean success = userService.removeById(1L);
// 在多线程环境下使用乐观锁进行安全的数据更新
public void updateUserDataConcurrently(Long userId, String newName) {
User user = userService.getById(userId);
user.setName(newName);
if (!userService.updateById(user)) {
// 处理更新失败的情况,例如重试或记录日志
}
}