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

相关推荐
q***46522 小时前
Spring中使用Async进行异步功能开发实战-以大文件上传为例
java·后端·spring
万物皆字节2 小时前
spring ai 初始化工具,代码链分析
spring
q***9943 小时前
Redis的Spring配置
数据库·redis·spring
q***49453 小时前
SpringGateway网关(Spring Gateway是Spring自己编写的,也是SpringCloud中的组件)
spring·spring cloud·gateway
mqiqe4 小时前
【Spring AI MCP】四、MCP 服务端
java·人工智能·spring
我是小妖怪,潇洒又自在4 小时前
springcloud alibaba搭建
后端·spring·spring cloud
L.EscaRC5 小时前
Spring IOC核心原理与运用
java·spring·ioc
在逃热干面6 小时前
(笔记)获取终端输出保存到文件
java·笔记·spring
海边夕阳20067 小时前
主流定时任务框架对比:Spring Task/Quartz/XXL-Job怎么选?
java·后端·spring·xxl-job·定时任务·job
帧栈8 小时前
开发避坑指南(72):HttpHeaders 的add()方法和set()方法有什么区别?
java·spring·http