Spring Transactional注释会导致不需要的回滚

时间:2013-01-29 13:32:45

标签: spring spring-transactions

我们正在使用Spring 3.2.0。我们的服务类都有* ServiceImpl和@Transactional注释,例如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. 没有包含事务边界
  4. VatcodeServiceImpl#loadBy()无法加载搜索到的数据库行并抛出DataNotFoundException
  5. 其他ServiceImpl中的事务现在标记为仅回滚。
  6. 看起来@Transactional边界的RuntimeException足以标记tx回滚,即使该特定调用实际上不是事务性的。

    我是否配置错误,或者Spring @Transactional方面是否出现意外行为?

    由于 Simon Niederberger

1 个答案:

答案 0 :(得分:0)

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