乐观锁的使用场景

该文章已生成可运行项目,

乐观锁的应用场景
乐观锁则假定并发冲突不会经常发生,因此它不会在开始操作时就锁定资源,而是在提交更新时检查是否有其他事务已经修改了该数据。如果检测到冲突,则拒绝此次操作。

点赞乐观锁实现

以下是使用 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;

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值