Spring boot 事务问题

本文探讨了Spring Boot中事务管理的一些不寻常问题,包括注解不生效、同一个注解类内不同方法的事务无法同时生效以及不同@Service类间的事务生效区别。总结得出,在需要事务的方法被同一类非事务方法调用或需要开启新事务的方法被同一类方法调用时,事务可能无效。关键在于理解Spring事务依赖于AOP代理调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring boot 的事务

Spring boot 的事务一直表现一些奇怪的特点,现在一一列举一下,留作参照。

事务 @Transactional 注解不生效

事务不生效的原因有很多,其他的都可以理解,但有一个确实不可理喻。当 @Service 第一个方法没有使用 @Transactional 注解时,后续调用的方法即使使用 @Transactional 注解。事务也不会开启。

在同一个 @Service 注解类下的不同 @Transactional 不能同时生效

这是spring 事务的奇怪特性。比如我要在 catch 里执行一些事务方法(关闭订单等。),我需要使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 开启一个独立事务,避免被主事务回滚。然而,不行!至少你不能写在同一个 Class 类里。你必须在另一个 Class 里的方法加入 @Transactional(propagation = Propagation.REQUIRES_NEW) 才能生效。
原因:同一个类的的方法调用不是使用spring的代理调用,而是类似于 this.xxx, 这个是类方法本身的调用无法使用事务aop

不同 @Service 注解的类的 @Transactional 生效区别

1,主类没有事务注解,被调用类有事务注解,事务生效。
2,主类有事务注解,被调用类有事务注解,事务生效。

结论

1,避免在需要开启事务的方法被不需要开启事务的同一个类的方法所调用,否则事务无效。
2,避免需要开启新事务的方法被同一个类的方法所调用,否则事务无效。
总结来说,避免非spring代理方法调用,否则无法开始spring aop事务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值