Springboot 事务
时间: 2025-01-10 20:54:15 浏览: 62
### Spring Boot 中的事务管理
#### 1. 默认事务管理器配置
在 Spring Boot 应用程序中,默认情况下会自动配置 `DataSourceTransactionManager` 或者其他适合的数据源事务管理器。如果应用程序中有多个数据源,则需要显式指定哪一个作为默认事务管理器。
对于大多数基于关系型数据库的应用来说,只需简单地引入依赖并设置好相应的连接池参数即可完成基本配置[^2]:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
```
以及 application.properties 文件中的相应属性:
```properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
```
#### 2. @Transactional 注解使用方法
为了实现声明式的事务控制,在服务层的方法上可以加上 `@Transactional` 注解来标记该操作应该在一个新的或现有的事务内执行。当发生异常时,整个事务将会回滚;如果没有抛出任何未捕获的异常,则提交更改。
以下是几个常见的场景及其对应的处理方式:
- **只读查询**: 对于只需要读取而不需要修改的操作,可以通过设置readOnly=true 来提高性能。
```java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional(readOnly = true)
public List<User> getAllUsers() {
return (List<User>) userRepository.findAll();
}
}
```
- **写入更新**: 当涉及到新增、删除或者批量更新等改变状态的动作时,应当省略 readOnly 属性让其保持 false 的默认值以便能够正常工作。
```java
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
@Transactional
public void placeOrder(Order newOrder) throws Exception{
try {
// 执行业务逻辑...
orderRepository.save(newOrder);
// 模拟可能出现错误的情况
if(true){
throw new RuntimeException("模拟失败");
}
} catch(Exception e){
log.error(e.getMessage());
throw e; // 抛出异常触发事务回滚
}
}
}
```
#### 3. 多数据源环境下的分布式事务解决方案
随着微服务体系结构的发展,跨多个独立部署单元之间共享资源变得越来越普遍。此时就需要考虑如何有效地协调这些不同位置上的持久化动作以确保一致性。针对这种情况,有几种流行的方案可供选择:
- **XA协议**:通过两阶段提交机制保证全局原子性;
- **TCC模式**:Try Confirm Cancel 流程设计,适用于高并发场景下减少锁定时间的需求;
- **Saga编排模型**:将长时间运行的任务拆分成一系列短小精悍的服务调用来逐步推进直至最终成功与否。
每种策略都有各自的特点和适用范围,请根据实际需求权衡利弊后再做决定。
阅读全文
相关推荐

















