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 事务管理。