Как настроить управление транзакциями для работы с 2 другими дб в Spring?

У меня есть 2 базы данных (MySql и HSQLDB). Я настроил 2 источника данных и 2 боба EntityManagerFactory. Я могу также настроить 2 соответствующих боба JpaTransactionManager.

Но я не знаю, как определить, кто из них должен использоваться для управления транзакциями для конкретного класса обслуживания. Я хочу использовать @Transactional аннотация с этой целью, но я на самом деле могу определить только один из txManagers:

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

Каков выход из этой ситуации?

35
задан Roman 25 December 2009 в 17:52
поделиться

2 ответа

Джавадок для JpaTransactionManager имеет некоторые советы по этому поводу:

Этот менеджер транзакций - подходящий для приложений, использующих единый JPA EntityManagerFactory для доступ к транзакционным данным. JTA (обычно через JtaTransactionManager) необходим для доступа к нескольким транзакциям ресурсы в рамках одной и той же сделки. Обратите внимание, что вам необходимо настроить ваш JPA-провайдер соответственно для того, чтобы сделать его участником JTA транзакции.

Другими словами, если вы находитесь с несколькими менеджерами сущностей, с соответствующими tx менеджерами, то вам следует подумать об использовании вместо них одного JtaTransactionManager . Менеджеры сущностей должны иметь возможность участвовать в JTA транзакциях, и это даст вам полную транзакцию между обоими менеджерами сущностей, не беспокоясь о том, в каком менеджере сущностей вы находитесь в любой момент времени.

Конечно, JtaTransactionManager требует полного JTA-сервера приложений, а не ванильного сервлет-движка, как Tomcat.

.
18
ответ дан 27 November 2019 в 07:12
поделиться

Объявите ваш без атрибута transaction-manager, объявите квалификаторы для менеджеров транзакций, как это:

<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <qualifier value="txManager1"/>
</bean>

Используйте этот классификатор в @Transactional в качестве значения для выбора одного из менеджеров транзакций:

@Transactional("txManager1")

или, с большим количеством свойств:

@Transactional(value = "txManager1", readOnly = true)   
19
ответ дан 27 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: