0

我们使用的是 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 中,我观察到以下效果:

  1. 一个控制器调用另一个 ServiceImpl,事务性的
  2. 其他 ServiceImpl 调用 VatcodeServiceImpl#loadBy()。没有围绕 loadBy() 调用的事务边界
  3. VatcodeServiceImpl#loadBy() 无法加载寻找的数据库行并抛出 DataNotFoundException
  4. 另一个 ServiceImpl 中的事务现在被标记为仅回滚。

似乎跨越 @Transactional 边界的 RuntimeException 足以标记 tx 仅回滚,即使该特定调用实际上不是事务性的。

我是在配置错误,还是 Spring @Transactional 方面在这里表现异常?

谢谢西蒙尼德伯格

4

1 回答 1

0

为什么你认为没有交易边界?您添加了注释 - 春天添加了方面,它打开事务并将其标记为仅在运行时异常时回滚。如果您真的不想回滚此事务,您可能会抛出一些已检查的异常而不是未检查的异常,但我不明白您为什么要这样做。

于 2016-09-16T10:52:46.487 回答