Spring的声明式事务处理使用AOP代理进行工作。当您获得事务性bean时,实际上您会获得一个代理,该代理包装您的bean实例,拦截方法调用,必要时启动事务,然后调用实际bean的方法,然后在必要时提交或回滚事务。
但是您是从同一个bean内的另一个方法调用bean的方法,因此代理被绕过,并且无法应用任何事务行为。
将方法放在另一个bean中,或使用AspectJ,后者检测字节码并可以拦截bean内部方法调用。
有关更详细的说明,请参见Spring文档。
为什么即使在Spring服务类的第二种方法中,即使propagation = Propagation.REQUIRES_NEW,事务也会回滚?
Spring的声明式事务处理使用AOP代理进行工作。当您获得事务性bean时,实际上您会获得一个代理,该代理包装您的bean实例,拦截方法调用,必要时启动事务,然后调用实际bean的方法,然后在必要时提交或回滚事务。
但是您是从同一个bean内的另一个方法调用bean的方法,因此代理被绕过,并且无法应用任何事务行为。
将方法放在另一个bean中,或使用AspectJ,后者检测字节码并可以拦截bean内部方法调用。
有关更详细的说明,请参见Spring文档。