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...

相关推荐
Flynn Liang8 小时前
AI 应用的安全红线:Spring AI 下的 Prompt 注入防护、PII 脱敏、输出审计与密钥管理
人工智能·安全·spring·数据泄露·springai·prompt注入
QCoding8 小时前
企业级Agent Evaluation实战:Agent能跑就能上线?AI Agent到底怎么测?
后端·spring
Flynn Liang15 小时前
Spring AI 上生产:限流熔断、密钥与成本治理、私有化/混合部署、降级与 Prompt 灰度架构全解
人工智能·spring·架构·高可用·springai·成本治理·生产架构
Flynn Liang15 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
liangbo717 小时前
Spring系列01:IoC 与 DI 到底解决了什么
java·spring
杨凯凡18 小时前
Spring Boot 的 @Transactional 为什么会失效?从代理、自调用到异常回滚的排查实战
java·spring boot·spring·事务·后端开发
哦虎!19 小时前
【JavaEE进阶】SpringBoot
spring
霸道流氓气质1 天前
AI 流式对话与实时聊天平台:SSE 解码竞态、有状态会话隔离与背压取消的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
frjc1 天前
Spring AI 高级实战:ChatMemory、Tool Calling 与 MCP 架构解析
人工智能·spring·架构
T量子永生2 天前
Unisoc(紫光展锐) Kernel 6.18 DDK 编译框架详解
linux·运维·spring