乐观锁的应用场景
乐观锁则假定并发冲突不会经常发生,因此它不会在开始操作时就锁定资源,而是在提交更新时检查是否有其他事务已经修改了该数据。如果检测到冲突,则拒绝此次操作。
点赞乐观锁实现
以下是使用 Java 和 MyBatis-Plus 实现乐观锁的代码示例。我们将基于 Spring Boot 和 MyBatis-Plus 框架完成点赞功能。
1. 数据库表设计
假设我们有一个 articles 表,包含以下字段:
id: 文章唯一标识。
title: 文章标题。
content: 文章内容。
likes: 点赞数。
version: 版本号(用于乐观锁)。
sql
深色版本
CREATE TABLE articles (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
likes INT DEFAULT 0,
version INT DEFAULT 0
);
2. 配置 MyBatis-Plus 和数据库连接
2.1 添加依赖
在 pom.xml 文件中添加 MyBatis-Plus 和 MySQL 驱动依赖:
xml
深色版本
org.springframework.boot
spring-boot-starter-web
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- MySQL Driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Lombok (Optional for code simplification) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.2 配置数据库连接
在 application.yml 中配置数据库连接信息:
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: your_username
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath:/mapper/*.xml
configuration:
map-underscore-to-camel-case: true
3. 实体类和 Mapper 接口
3.1 创建实体类
使用 @Version 注解来标识版本号字段。
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;
@Data
@TableName("articles")
public class Article {
@TableId
private Long id;
private String title;
private String content;
private Integer likes;
@Version
private Integer version; // 版本号字段,用于乐观锁
}
3.2 创建 Mapper 接口
继承 MyBatis-Plus 提供的 BaseMapper 接口。
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ArticleMapper extends BaseMapper<Article> {
}
4. 配置乐观锁插件
在 Spring Boot 启动类中配置 MyBatis-Plus 的乐观锁插件。
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
5. 实现点赞功能
5.1 Service 层实现
编写点赞逻辑,使用乐观锁更新点赞数。
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ArticleService {
@Autowired
private ArticleMapper articleMapper;
public String likeArticle(Long articleId) {
// 查询文章信息
Article article = articleMapper.selectById(articleId);
if (article == null) {
return "Article not found";
}
// 更新点赞数和版本号
article.setLikes(article.getLikes() + 1);
// 使用 MyBatis-Plus 自动处理乐观锁
int rows = articleMapper.updateById(article);
if (rows > 0) {
return "Like successful, new likes: " + article.getLikes();
} else {
return "Optimistic lock conflict, please try again";
}
}
}
5.2 Controller 层实现
提供 RESTful API 接口。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/articles")
public class ArticleController {
@Autowired
private ArticleService articleService;
@PostMapping("/{id}/like")
public String likeArticle(@PathVariable Long id) {
return articleService.likeArticle(id);
}
}
6. 测试接口
启动 Spring Boot 应用后,可以通过以下方式测试点赞功能:
请求示例
bash
深色版本
POST http://localhost:8080/articles/1/like
响应结果
成功时返回:“Like successful, new likes: X”
如果发生乐观锁冲突,返回:“Optimistic lock conflict, please try again”
7. 核心原理
乐观锁的核心思想:
在更新数据时,MyBatis-Plus 会自动检查 version 字段是否匹配。
如果匹配,则更新数据并递增 version。
如果不匹配,则更新失败,返回受影响行数为 0。
SQL 示例:
sql
深色版本
UPDATE articles
SET likes = likes + 1, version = version + 1
WHERE id = 1 AND version = current_version;
1195

被折叠的 条评论
为什么被折叠?



