使用乐观锁
乐观锁是处理并发冲突的一种策略,假设多个事务在处理数据时不会经常发生冲突,因此不会在数据访问时加锁,而是在数据提交更新时,通过一种机制来验证在此期间是否有其他事务修改了数据。如果数据被其他事务修改,则会更新失败。
1. 添加版本号字段
假设有一个 user
表,添加一个 version
字段作为乐观锁的版本号,用于记录数据被修改的次数。
ALTER TABLE `user` ADD COLUMN `version` INT NOT NULL DEFAULT 1;
2. 实体类中添加版本号属性
import com.baomidou.mybatisplus.annotation.Version;
public class User {
// ... 其他属性
@Version
private Integer version;
// ... getter 和 setter
}
3. 配置乐观锁插件
在 Spring Boot 应用中,可以在配置类中添加乐观锁插件:
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.yourpackage.mapper") // mapper所在的包路径
public class MybatisPlusConfig {
// 添加乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
4. 业务代码中使用乐观锁
在执行更新操作时,MyBatis-Plus 会自动检查对应实体的 version
字段,如果在执行更新操作时,实体的version
字段版本低于数据库记录的version
版本,则执行更新操作后数据库数据不会被修改,也不会报错。
// 假设有一个 UserMapper
public interface UserMapper extends BaseMapper<User> {
}
// 在业务代码中
User user = userMapper.selectById(1); // 假设要更新id为1的用户
user.setName("新名字");
userMapper.updateById(user); // 执行更新操作
如果在执行 updateById(user)
期间,id为1的用户已经被其他事务修改过,那么 version
字段的值会增加,导致更新失败。