抛出非运行时异常
捕获了运行时异常,但是重新抛出的却是非运行时异常
见上文
方法不是public
spring事务方法回滚必须要求public吗?
是的,Spring 事务回滚确实要求方法必须是 public 的。这是因为 Spring 事务管理使用 AOP(面向切面编程)来实现的,具体说明如下:
- Spring 事务是通过 AOP 代理实现的,代理只能拦截 public 方法的调用
- 如果你把事务方法声明为 protected、private 或者默认访问级别,Spring 的事务代理将无法拦截这些方法调用
- 当这些非 public 方法被调用时,事务相关的功能(如开启、提交、回滚事务)将不会生效
这是 Spring 官方文档中明确说明的限制。如果你尝试在非 public 方法上使用 @Transactional 注解,Spring 不会报错,但事务功能不会生效。
解决方案:
- 始终将需要事务支持的方法声明为 public
- 如果你需要在内部调用中使用事务,可以考虑把事务逻辑提取到一个单独的 public 方法中
另外,需要注意的是,同一个类内部的方法调用也会绕过事务代理。例如:
java
@Service
public class UserService {
@Transactional
public void createUser(User user) {
// 这里的事务会生效
}
public void batchCreateUsers(List<User> users) {
for (User user : users) {
this.createUser(user); // 这里调用的是this.createUser,事务不会生效!
}
}
}
这种情况下,如果你希望内部方法调用也能触发事务,可以考虑使用 AopContext.currentProxy()
或者将方法抽取到另一个 Bean 中。