最近在公司的业务上遇到了并发的问题,并且还是很常见的并发问题,公司业务就是最常见的“订单+账户”问题,算是低级的失误了。由于公司业务相对比较复杂且不适合公开,在此用一个很常见的业务来还原一下场景,同时介绍悲观锁和乐观锁是如何解决这类并发问题的。
推荐视频链接
- Java 微服务实践视频教程 - Spring Boot
- Java 微服务实践 视频教程- Spring Cloud
- redis高可用视频
- 分布式电商商城视频教程
- kubernets+docer
- jvm
- 秒杀项目实战
- Linux shell
业务还原
首先环境是:Spring Boot 2.1.0 + data-jpa + mysql + lombok
数据库设计
对于一个有评论功能的博客系统来说,通常会有两个表:1.文章表 2.评论表。其中文章表除了保存一些文章信息等,还有个字段保存评论数量。我们设计一个最精简的表结构来还原该业务场景。
article 文章表
字段 | 类型 | 备注 |
---|---|---|
id | INT | 自增主键id |
title | varchar | 文章标题 |
comment_count | INT | 文章的评论数量 |
comment 评论表
字段 | 类型 | 备注 |
---|---|---|
id | INT | 自增主键id |
article_id | INT | 评论的文章id |
content | varchar | 评论内容 |
当一个用户评论的时候:
- 根据文章id获取到文章
- 插入一条评论记录
- 该文章的评论数增加并保存
代码实现
首先在maven中引入对应的依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>