Аннотации Spring Transactional вызывают только нежелательный откат

Мы используем 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, я наблюдаю следующий эффект:

  1. Контроллер вызывает другой ServiceImpl, транзакционный
  2. Другой ServiceImpl вызывает VatcodeServiceImpl # loadBy (). Границы транзакции, обернутые вокруг вызова loadBy (), отсутствуют.
  3. VatcodeServiceImpl # loadBy () не может загрузить искомую строку базы данных и выдает исключение DataNotFoundException.
  4. Транзакция в другом ServiceImpl теперь помечена как откат только.

Похоже, что RuntimeException через границу @Transactional достаточно, чтобы отметить откат tx-only, даже если этот конкретный вызов на самом деле не был транзакционным.

Я что-то настраиваю неправильно, или здесь неожиданно ведет себя аспект Spring @Transactional?

Спасибо Саймон Нидербергер


person Simon    schedule 29.01.2013    source источник
comment
Находится ли VatCodeServiceImpl на каком-либо из путей сканирования компонентов?   -  person ach    schedule 29.01.2013
comment
@ach: в то время мы не используем context:component-scan, но VatCodeServiceImpl определяется как bean-компонент в контексте Spring.   -  person Simon    schedule 10.02.2013


Ответы (1)


Как вы думаете, почему нет границы транзакции? Вы добавили аннотации - добавлен весенний аспект, который открывает транзакцию и отмечает ее откат только при исключениях во время выполнения. Вы можете выбросить какое-то проверенное исключение вместо непроверенного, если вы действительно не хотите откатывать эту транзакцию, но я не понимаю, зачем вам это делать.

person Yuri Plevako    schedule 16.09.2016