Spring несколько источников @Transactional - PullRequest
11 голосов
/ 25 декабря 2009
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="data.emf" />
</bean>

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


<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="data.emf" />
</bean>

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


Могу ли я использовать на своем сервисном уровне @Transactional(name="transactionManager2");, чтобы определить, какого менеджера транзакций я использую, если у меня несколько менеджеров транзакций?

Ответы [ 2 ]

21 голосов
/ 25 декабря 2009

Вы можете указать, какой менеджер tx использовать с @Transactional, используя атрибут value :

Значение квалификатора для указанного сделка.

Может использоваться для определения цели менеджер транзакций, соответствующий значение квалификатора (или имя бина) определенный PlatformTransactionManager определение бина.

Например:

@Transactional("txManager1");

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

Обычно это не проблема, но не имеет смысла иметь несколько менеджеров транзакций, если у вас нет веских причин для этого. Если вам нужны два tx-менеджера, обычно лучше посмотреть, сможете ли вы обойтись одним. Например, если на вашем сервере приложений настроено два источника данных, вы можете включить оба в один JtaTransactionManager, а не в два отдельных JpaTransactionManager или DataSourceTransactionmanagers.

2 голосов
/ 25 декабря 2009

Еще о необходимости более одного менеджера транзакций. Возможно, вы пытаетесь выполнить вложенные или отдельные транзакции в последовательности - тогда вы можете использовать различные параметры распространения. Этого можно добиться с помощью конфигурации с использованием одного менеджера транзакций, см. Распространение транзакции .

...