最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。
环境:SpringBoot3.2.5
1. 简介
什么是大事务?它指的是运行时间较长、操作数据较多的事务,这类事务容易导致系统响应缓慢,并可能引发一系列问题,如锁等待、死锁、接口超时、数据库主从延迟、事务回滚时间长以及数据库连接池被占满等。
大事务问题产生的原因通常包括操作的数据量大、大量的锁竞争以及事务中其他非数据库操作的耗时较长等。这些问题会导致数据库连接池容易被撑爆,锁定太多数据造成阻塞和锁超时等。
为了解决大事务问题,我总结了以下七点优化建议,希望能为你提供帮助。
2. 优化建议
2.1 分解大事务
将大事务拆分为多个小事务,以减少每个事务的锁定时间和资源占用。如下示例:
优化前
public void placeOrderOld(Long productId, Long userId, int quantity) {
// 1.更新库存
inventoryService.decreaseStock(productId, quantity) ;
// 2.生成订单
Order order = new Order(userId, productId, quantity) ;
orderRepository.save(order);
// 3.增加用户积分
userService.updateUserPoints(userId, quantity * 6) ;
}
所有的操作都在一个事务中完成,这有任何一个操作慢都会影响整个事务的提交,并且还会延迟锁的占用时间。
优化后
public void placeOrderNew(Long productId, Long userId, int quantity) {
// ...
}
public class InventoryService {
@Transactional
public void decreaseStock(Long productId, Integer quantity) {
// ...
}
}
public class UserService {
@Transactional
public void updateUserPoints(Long userId, Integer points) {
// ...
}
}