Мы используем Spring 3.2.0. Все наши классы обслуживания имеют * ServiceImpl с аннотациями @Transactional, например, в bean-компоненте vatcodeServiceTarget:
@Transactional(propagation=Propagation.REQUIRED,readOnly=true)
public VatCodeModel loadBy(String crsname, String crscode, int clientid) {
..
}
Мы оборачиваем ServiceImpl с помощью TransactionProxyFactoryBean
<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 теперь помечена как откат только.
Похоже, что RuntimeException через границу @Transactional достаточно, чтобы отметить откат tx-only, даже если этот конкретный вызов на самом деле не был транзакционным.
Я что-то настраиваю неправильно, или здесь неожиданно ведет себя аспект Spring @Transactional?
Спасибо Саймон Нидербергер
VatCodeServiceImpl
на каком-либо из путей сканирования компонентов? - person ach   schedule 29.01.2013context:component-scan
, ноVatCodeServiceImpl
определяется как bean-компонент в контексте Spring. - person Simon   schedule 10.02.2013