帮助中心/最新通知

质量为本、客户为根、勇于拼搏、务实创新

< 返回文章列表

【服务器相关】MySQL数据库优化之基于mysql乐观锁实现秒杀的示例源码

发表时间:2025-06-16 03:46:00 小编:油条
 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<!--mysql-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>

<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>

2、model

在这里插入图片描述

可通过逆向工程进行配置,参考idea+mybatis逆向工程

4、dao

public interface StockMapper {

Stock checkStock(Integer id);//校验库存

int updateSale(Stock stock);//扣除库存
}

public interface StockOrderMapper {

//创建订单
void createOrder(StockOrder order);
}

5、sql

商品校验和减库存

下订单
6、service
public interface StockOrderService {
public Integer createOrder(Integer id);
}

7、实现


@Service
public class StockOrderServiceImpl implements StockOrderService {
@Autowired
private StockOrderMapper stockOrderMapper;

@Autowired
private StockMapper stockMapper;

@Override
@Transactional(rollbackFor = Exception.class)
public Integer createOrder(Integer id) {
//校验库存
Stock stock = checkStock(id);
if(stock.getCount()>0){
System.out.println("当前库存:" + stock.getCount());
//扣库存
if(updateSale(stock) == 1){
return createOrder(stock);
}else {
return 0;
}
}
return 0;
}

//校验库存
private Stock checkStock(Integer id) {
return stockMapper.checkStock(id);
}

//扣库存
private int updateSale(Stock stock){
return stockMapper.updateSale(stock);
}

//下订单
private Integer createOrder(Stock stock){
StockOrder order = new StockOrder();
order.setSid(stock.getId());
order.setCreateTime(new Date());
order.setName(stock.getName());
stockOrderMapper.createOrder(order);
return order.getId();
}
}

8、测试
模拟100人参与活动

@SpringBootTest
class MsServerApplicationTests {
@Autowired
private StockOrderService stockOrderService;

@Test
void contextLoads() throws InterruptedException {

// 库存初始化为10,这里通过CountDownLatch和线程池模拟100个并发
int threadTotal = 100;

ExecutorService executorService = Executors.newCachedThreadPool();

final CountDownLatch countDownLatch = new CountDownLatch(threadTotal);
for (int i = 0; i < threadTotal ; i++) {
int uid = i;
executorService.execute(() -> {
try {
stockOrderService.createOrder(1);
} catch (Exception e) {
e.printStackTrace();
}
countDownLatch.countDown();
});
}

countDownLatch.await();
executorService.shutdown();

}
}

9、结果

在这里插入图片描述

商品表

在这里插入图片描述

订单表

在这里插入图片描述

到此这篇关于基于mysql乐观锁实现秒杀的示例代码的文章就介绍到这了,更多相关mysql乐观锁秒杀内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


联系我们
返回顶部