我们使用的是 Spring 3.2.0。我们的服务类都有带有@Transactional 注释的*ServiceImpl,例如在bean vatcodeServiceTarget 上:
@Transactional(propagation=Propagation.REQUIRED,readOnly=true)
public VatCodeModel loadBy(String crsname, String crscode, int clientid) {
..
}
我们用 TransactionProxyFactoryBean 包装 ServiceImpl
<bean id="vatcodeService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target" ref="vatcodeServiceTarget"/>
<property name="transactionAttributeSource">
<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
</property>
</bean>
并将生成的 bean 注入到我们的控制器中。如果另一个 ServiceImpl 需要“vatcodeService”,我们实际上会注入“vatcodeServiceTarget”,因此事务边界被丢弃。
这种方法在 Spring 2.0 中运行良好。现在,在 Spring 3.2.0 中,我观察到以下效果:
- 一个控制器调用另一个 ServiceImpl,事务性的
- 其他 ServiceImpl 调用 VatcodeServiceImpl#loadBy()。没有围绕 loadBy() 调用的事务边界
- VatcodeServiceImpl#loadBy() 无法加载寻找的数据库行并抛出 DataNotFoundException
- 另一个 ServiceImpl 中的事务现在被标记为仅回滚。
似乎跨越 @Transactional 边界的 RuntimeException 足以标记 tx 仅回滚,即使该特定调用实际上不是事务性的。
我是在配置错误,还是 Spring @Transactional 方面在这里表现异常?
谢谢西蒙尼德伯格