@Transactional(rollbackFor = Exception.class)和 @Transactional 有区别吗
时间: 2024-11-30 10:14:20 浏览: 24
ransactional注解加不加 rollbackFor = Exception.class 的区别?.pdf
`@Transactional(rollbackFor = Exception.class)` 和 `@Transactional` 是 Spring 提供的事务管理注解,它们的主要区别在于对异常处理的控制。
`@Transactional` 默认的行为是,只要事务内部发生了未被捕获的运行时异常(非 checked exception),Spring 会自动回滚事务。这是说,如果方法内抛出了任何异常,无论是否明确捕获,事务都会被撤消,确保数据库的状态保持一致性。
而 `@Transactional(rollbackFor = Exception.class)` 更具针对性,它允许你在指定的异常列表上配置回滚规则。当你将 `Exception.class` 或一组具体的异常类名传给 `rollbackFor` 属性,只有当这些异常被抛出时才会触发事务回滚。如果异常不在列表中,那么事务默认会提交,除非另有其他的 rollback 规定。
举个例子,如果你只想在遇到特定类型的业务错误(比如 UserNotFoundException)时回滚事务,而不希望因为其他非预期的系统异常导致事务被回滚,可以这样使用:
```java
@Transactional(rollbackFor = UserNotFoundException.class)
public void createUser(User user) {
try {
userService.save(user); // 如果这里抛出 UserNotFoundException,则会回滚事务;其他异常则会由Spring处理
} catch (UserNotFoundException e) {
// 自定义异常处理
}
}
```
因此,`@Transactional` 是一个更通用的设置,`@Transactional(rollbackFor = Exception.class)` 则提供了更细致的控制,让你可以选择性地控制哪些异常引发事务回滚。
阅读全文