spring事务何时会失效?

抛出非运行时异常

捕获了运行时异常,但是重新抛出的却是非运行时异常

见上文

方法不是public

spring事务方法回滚必须要求public吗?

是的,Spring 事务回滚确实要求方法必须是 public 的。这是因为 Spring 事务管理使用 AOP(面向切面编程)来实现的,具体说明如下:

  1. Spring 事务是通过 AOP 代理实现的,代理只能拦截 public 方法的调用
  2. 如果你把事务方法声明为 protected、private 或者默认访问级别,Spring 的事务代理将无法拦截这些方法调用
  3. 当这些非 public 方法被调用时,事务相关的功能(如开启、提交、回滚事务)将不会生效

这是 Spring 官方文档中明确说明的限制。如果你尝试在非 public 方法上使用 @Transactional 注解,Spring 不会报错,但事务功能不会生效。

解决方案:

  1. 始终将需要事务支持的方法声明为 public
  2. 如果你需要在内部调用中使用事务,可以考虑把事务逻辑提取到一个单独的 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 中。

参考

www.cnblogs.com/12lisu/p/18...

blog.csdn.net/see__you__a...

相关推荐
八股文领域大手子33 分钟前
Spring Boot Controller 如何处理HTTP请求体
java·开发语言·sql·spring·spring cloud
小刘|43 分钟前
Spring,SpringMVC,SpringBoot,SpringCloud的区别
spring boot·spring·spring cloud
为美好的生活献上中指2 小时前
java每日精进 5.07【框架之数据权限】
java·开发语言·mysql·spring·spring cloud·数据权限
一刀到底2112 小时前
spring ai alibaba 使用 SystemPromptTemplate 很方便的集成 系统提示词
spring·ai alibaba
lyrhhhhhhhh3 小时前
Spring框架(1)
java·后端·spring
喝养乐多长不高4 小时前
Spring Web MVC基础理论和使用
java·前端·后端·spring·mvc·springmvc
magic 2456 小时前
第2章——springboot核心机制
java·spring boot·spring
二十雨辰7 小时前
[Spring]-认识Spring
java·数据库·spring
曹朋羽10 小时前
Spring Cloud LoadBalancer (负载均衡)
spring·spring cloud·微服务·负载均衡
hello_ejb311 小时前
聊聊Spring AI autoconfigure模块的拆分
java·人工智能·spring