Возникла проблема с несколькими менеджерами транзакций

У меня есть два менеджера транзакций, определенных в двух отдельных файлах Spring XML, и оба они загружены в контексте Spring

Файл Один

   <tx:annotation-driven transaction-manager="transactionManager1"/>

  <bean id="transactionManager1"
       class="org.springframework.jdbc.DataSourceTransactionManager">
    ...
  </bean>

Файл Два

 <tx:annotation-driven transaction-manager="transactionManager2"/>
  <bean id="transactionManager2"
          class="org.springframework.jdbc.DataSourceTransactionManager">
    ...
  </bean> 

Если я не указал какой-либо определитель для нижеприведенного сервиса, какой диспетчер транзакций будет использовать Spring.

public class TransactionalService {

    @Transactional
    public void setSomething(String name) { ... }

    @Transactional
    public void doSomething() { ... }
}

1 ответ

Проверьте 11.5.6 Использование @Transactional из официальной документации:

Вы можете опустить transaction-manager атрибут в <tx:annotation-driven/> тег, если имя бина PlatformTransactionManager что вы хотите подключить имеет имя transactionManager, Если PlatformTransactionManager bean-компонент, который вы хотите добавить в зависимость, имеет любое другое имя, тогда вы должны использовать transaction-manager атрибут явно [...]

Так как ни один из ваших менеджеров транзакций не назван transactionManager, вы должны указать, какой менеджер транзакций следует использовать для методов, помеченных как @Transactional,


ОБНОВЛЕНИЕ: для решения вашего измененного вопроса. Вы можете указать, какой менеджер транзакций использовать @Transactional аннотация (см.: @Transactional.value()):

@Transactional("transactionManager1")
//...

@Transactional("transactionManager2")
//...

Однако я вижу несколько проблем с вашей текущей настройкой:

  • вы определяете <tx:annotation-driven/> дважды с разными менеджерами транзакций. Я не думаю, что такая конфигурация действительна

  • без указания менеджера транзакций, какой из них следует использовать?

Я думаю, что решение должно работать, чтобы определить <tx:annotation-driven transaction-manager="transactionManager1"/> один раз и использовать @Transactional использовать первый менеджер и @Transactional("transactionManager2") использовать второй. Или наоборот.

Другие вопросы по тегам