Spring事务在哪些场景下会失效

(1)非 public 方法:Spring 事务默认只对 public 方法生效。

(2)同一类内方法调用:Spring 事务是基于代理实现的。如果在同一个类中,一个非事务方法调用另一个事务方法,事务不会生效,因为代理对象无法拦截内部调用。

(3)异常被捕获并未抛出:Spring 事务默认在遇到 RuntimeException 或 Error 时回滚。如果异常被捕获并未重新抛出,事务不会回滚。

(4)错误的传播行为:如果事务的传播行为配置不当,可能导致事务不生效。例如,REQUIRES_NEW 会创建新事务,而 NOT_SUPPORTED 会以非事务方式执行。

(5)事务管理器未正确配置:如果事务管理器未正确配置(如未启用事务管理、未指定事务管理器等),事务不会生效。

(6)多线程调用:Spring 事务是基于线程绑定的。如果在多线程环境下调用事务方法,事务不会跨线程传播。

(7)事务方法被 final 或 static 修饰:Spring 事务是基于动态代理实现的。如果方法被 final 或 static 修饰,代理对象无法重写该方法,导致事务失

(8)数据库引擎不支持事务:某些数据库引擎(如 MySQL 的 MyISAM)不支持事务。

(9)事务注解被错误使用:如果 @Transactional 注解被错误地放在接口上,且使用了基于类的代理(CGLIB),事务不会生效。

(10)事务超时:如果事务执行时间超过配置的超时时间,事务会被回滚。

更新 2025年5月6日