spring事务失效场景

1.使用非 public 方法:
Spring 的事务管理默认只会对 public 方法生效。如果事务性方法不是 public,事务将不会被代理处理。

2.事务方法在同一个类中相互调用(自调用):
同一个类中不含事务的A方法调用另一个含事务的B方法时,Spring 事务管理将不会生效。因为 Spring 的事务是通过 AOP 实现的,而自调用不会触发 AOP 代理。

3.事务传播行为设置不当:
Spring 提供了多种事务传播行为(如 REQUIRED, REQUIRES_NEW, NESTED 等),不正确的配置可能会导致事务管理行为不符合预期,进而导致事务失效。

4.未被 Spring 容器管理的类或方法:
如果事务性方法所在的类没有被 Spring 容器管理(即没有通过 Spring 的 @Component, @Service 等注解标记或通过 XML 配置定义),事务管理将不会生效。

5.异常类型不匹配:
Spring 事务默认只对 RuntimeException(或其子类)触发回滚。对 Checked Exception 不回滚,除非明确配置 rollbackFor 属性。如果方法抛出的异常类型不在回滚范围内,事务将不会回滚。

6.数据库不支持事务:
某些数据库或数据库操作(如某些 MySQL 引擎或 DDL 操作)不支持事务,这会导致事务管理失效。

7.事务管理器配置错误:
如果项目中有多个事务管理器,可能会因为错误配置导致事务失效。必须确保使用正确的事务管理器。

8.异步方法(@Async)中使用事务:
@Async 注解通常用于异步执行的方法,这些方法运行在独立的线程中,事务可能无法传播到这些线程,导致事务失效。

9.含事务的B方法的异常被A方法的catch捕获,导致B方法不能正常回滚,进而事务失效

这些都是比较常见的 Spring 事务失效场景,理解和避免这些场景有助于正确使用 Spring 事务管理。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值