在 Spring 中,事务方法通常用 @Transaction 注解。当调用事务方法时,Spring 自动管理事务生命周期,确保在出现异常时数据的完整性。但是,当从同一个类中调用事务方法时,会出现意外行为。事务似乎被绕过了,让开发人员摸不着头脑。
Spring 使用动态代理(例如 CGLIB)来拦截方法调用并应用事务行为。但是,当事务方法调用同一类中的另一个事务方法时,动态代理将被绕过。这是因为两种情况下的目标对象是相同的,并且仅为外部方法调用创建代理。
要解决此问题,您有两个选项:
要配置 AspectJ 进行事务处理,请按照以下步骤操作:
对于 3.0 之前的 Spring 版本,还要将以下 bean 定义添加到您的配置中:
<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf"> <property name="transactionManager" ref="transactionManager" /> </bean>
通过拥抱 AspectJ 或重构您的代码,您可以克服 Spring 默认事务处理的限制并确保一致的事务行为,即使对于同一对象中的嵌套调用也是如此类。
以上是为什么在同一个类中调用 Spring 事务会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!