@Version 注解是 MyBatis-Plus 提供的用于实现乐观锁机制的一个注解。

核心概念

乐观锁(Optimistic Locking): 乐观锁是一种并发控制的方法,它假设数据一般情况下不会造成冲突,因此在提交更新之前,才会检查数据是否已被其他事务修改。如果检测到冲突,则返回错误信息给用户,让用户决定如何处理。

操作步骤

  1. 实体类中添加版本字段: 在需要进行乐观锁控制的实体类中添加一个字段,并使用 @Version 注解标记该字段。支持的数据类型包括 int, Integer, long, Long, Date, Timestamp, LocalDateTime 等。

    @Version
    private Integer version;
    
  2. 数据库表中添加版本字段: 在对应的数据库表中添加一个名为 version 的字段,默认值为 0。

  3. 配置乐观锁拦截器: 在 Spring Boot 配置类中添加乐观锁拦截器 Bean。

    @Configuration
    public class MybatisPlusConfig {
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
            return interceptor;
        }
    }
    
  4. 测试乐观锁功能: 创建两个线程模拟并发更新场景,观察版本号和数据是否按预期变化。

常见错误及解决方案

  • 如果没有正确配置乐观锁拦截器,@Version 注解可能不会生效。确保在配置类中正确添加了 OptimisticLockerInnerInterceptor
  • 数据库表中缺少 version 字段或字段类型不匹配也会导致乐观锁无法正常工作。

注意事项

  • 乐观锁仅支持 updateById(id)update(entity, wrapper) 方法,在使用 update(entity, wrapper) 方法时,wrapper 不能复用。
  • 版本号字段的初始值应设置为默认值 0 或者根据业务需求设定。

使用技巧

  • 可以通过捕获异常来处理乐观锁失败的情况,给用户提供友好的提示信息。
  • 对于高并发场景,合理设计业务逻辑减少冲突的可能性。

最佳实践与性能优化

  • 在高读写比例的场景下,乐观锁比悲观锁更适用,因为它减少了锁定资源的时间。
  • 结合 MyBatis-Plus 的分页插件等其他插件一起使用时,注意插件加载顺序和兼容性问题。