在Java中,事务注解失效的场景有以下几种情况:
注解放在非public方法上:事务注解只能在public修饰的方法上生效,如果将其放在非public方法上,事务注解将会失效。
自调用方法:如果一个方法在同一个类中被自己调用(而不是通过代理对象调用),事务注解将会失效。因为Spring的事务是通过代理对象实现的,自调用方法将绕过代理对象,导致事务注解失效。
异常被catch住:如果在方法中捕获了异常并没有重新抛出,事务注解将会失效。因为Spring的事务是基于异常的回滚机制实现的,方法中的异常必须被重新抛出才能触发事务回滚。
注解放在私有方法上:事务注解只能在public修饰的方法上生效,如果将其放在私有方法上,事务注解将会失效。
注解放在非Spring管理的Bean上:事务注解只能在Spring管理的Bean上生效,如果将其放在非Spring管理的Bean上,事务注解将会失效。
需要注意的是,以上场景仅适用于基于注解的事务管理,如果使用编程式事务管理,这些场景可能不适用。此外,不同的Spring版本和配置方式可能会有一些差异,具体的失效场景可能会有所不同。