Spring事务失效的原因(转载)
特殊说明:转载博主内容,此处仅作学习整理记录
1、没有被 Spring 管理 。
//@Service public class OrderServiceImpl implements OrderService { @Transactional public void updateOrder(Order order) { //update order } }
把 @Service
注掉,这个类就不会被加载成 Bean,这个类就不会被 Spring 管理了,事务自然就失效了。
2、方法不是 public 的(?)
@Transactional
只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ
代理模式。 spring的声明式事务是基于代理模式的。由于java继承时, 不能重写 private , final , static 修饰的方法。private 方法, final 方法 和 static 方法都没有事务支持。原因,pring的声明式事务是基于代理模式的。 所以, 所有的 private 方法, final 方法 和 static 方法 都无法 直接 添加spring的事务管理功能。
private 方法无法添加事务管理. final 方法无法添加事务管理. static 方法无法添加事务管理. 当绕过代理对象, 直接调用添加事务管理的方法时, 事务管理将无法生效.?
3、异常被吃自定义捕获或异常类型不对
@Service public class OrderServiceImpl implements OrderService { @Transactional public void updateOrder(Order order) { try { } catch { } } }
4、自身(this)调用问题(疑惑点)
@Service public class TestService { /** * 这里调用methodB() 的事务将会失效 */ public void methodA(){ this.methodB(); } @Transactional public void methodB(){ } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~