在 SpringBoot 中,事务管理是确保数据库操作一致性的重要机制。事务分为 手动事务 和 自动事务,两者在实现方式和适用场景上有所不同。
自动事务
自动事务是通过 声明式事务 实现的,主要依赖 @Transactional 注解。Spring 会基于 AOP 拦截目标方法,在方法执行前开启事务,执行后根据结果提交或回滚事务。
使用方式:
@Service
public class OrderService {
@Transactional(rollbackFor = Exception.class)
public void processOrder() {
// 数据库操作
saveOrder();
updateInventory();
}
}
特点:
- 简单快捷:无需手动管理事务,Spring 自动处理事务的开启、提交和回滚。
- 配置灵活:支持设置事务传播行为(如 REQUIRED、REQUIRES_NEW)、隔离级别(如 READ_COMMITTED)、超时时间等。
- 适用场景:适合大多数常规业务逻辑。
注意事项:
- @Transactional 只能应用于 public 方法,且需通过外部调用才能生效。
- 默认情况下,Spring 仅对 RuntimeException 及其子类进行回滚。若需对其他异常回滚,可通过 rollbackFor 属性指定。
手动事务
手动事务通过 编程式事务管理 实现,使用 PlatformTransactionManager 手动控制事务的开启、提交和回滚。
使用方式:
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private TransactionDefinition transactionDefinition;
public void manualTransaction() {
TransactionStatus status = transactionManager.getTransaction(transactionDefinition);
try {
// 数据库操作
saveOrder();
updateInventory();
// 提交事务
transactionManager.commit(status);
} catch (Exception e) {
// 回滚事务
transactionManager.rollback(status);
throw e;
}
}
特点:
- 灵活性高:开发者可以完全控制事务的生命周期。
- 适用场景:适用于复杂场景,例如需要在同一方法中对部分操作进行回滚,或无法使用 @Transactional 的场景。
手动回滚示例:
try {
// 数据库操作
saveOrder();
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
throw e;
}
选择建议
- 优先使用自动事务:声明式事务简单易用,适合大多数业务场景。
- 使用手动事务的场景:当需要更精细的事务控制(如部分回滚)或无法使用 @Transactional 时,选择手动事务。
无论是手动事务还是自动事务,都需要注意事务的隔离级别、传播行为以及异常处理,以确保数据一致性和系统稳定性。