@Version 注解是 MyBatis-Plus 提供的用于实现乐观锁机制的一个注解。
核心概念
乐观锁(Optimistic Locking): 乐观锁是一种并发控制的方法,它假设数据一般情况下不会造成冲突,因此在提交更新之前,才会检查数据是否已被其他事务修改。如果检测到冲突,则返回错误信息给用户,让用户决定如何处理。
操作步骤
实体类中添加版本字段: 在需要进行乐观锁控制的实体类中添加一个字段,并使用 @Version 注解标记该字段。支持的数据类型包括 int, Integer, long, Long, Date, Timestamp, LocalDateTime 等。
@Version private Integer version;
数据库表中添加版本字段: 在对应的数据库表中添加一个名为
version
的字段,默认值为 0。配置乐观锁拦截器: 在 Spring Boot 配置类中添加乐观锁拦截器 Bean。
@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } }
测试乐观锁功能: 创建两个线程模拟并发更新场景,观察版本号和数据是否按预期变化。
常见错误及解决方案
- 如果没有正确配置乐观锁拦截器,
@Version
注解可能不会生效。确保在配置类中正确添加了OptimisticLockerInnerInterceptor
。 - 数据库表中缺少
version
字段或字段类型不匹配也会导致乐观锁无法正常工作。
注意事项
- 乐观锁仅支持
updateById(id)
和update(entity, wrapper)
方法,在使用update(entity, wrapper)
方法时,wrapper 不能复用。 - 版本号字段的初始值应设置为默认值 0 或者根据业务需求设定。
使用技巧
- 可以通过捕获异常来处理乐观锁失败的情况,给用户提供友好的提示信息。
- 对于高并发场景,合理设计业务逻辑减少冲突的可能性。
最佳实践与性能优化
- 在高读写比例的场景下,乐观锁比悲观锁更适用,因为它减少了锁定资源的时间。
- 结合 MyBatis-Plus 的分页插件等其他插件一起使用时,注意插件加载顺序和兼容性问题。