我们正在使用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中,我观察到以下效果:
看起来@Transactional边界的RuntimeException足以标记tx回滚,即使该特定调用实际上不是事务性的。
我是否配置错误,或者Spring @Transactional方面是否出现意外行为?
由于 Simon Niederberger
答案 0 :(得分:0)
为什么你认为没有交易边界?您添加了注释 - 弹簧添加的方面,它打开事务并在运行时异常上标记它回滚。如果你真的不想回滚这个交易,你可能会抛出一些已检查的异常,而不是未经检查的异常,但我不明白你为什么要这样做。