Spring несколько источников данных @Transactional

<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"); на моем уровне обслуживания, чтобы определить, какой диспетчер транзакций я использую, если у меня несколько диспетчеров транзакций?


person cometta    schedule 25.12.2009    source источник
comment
Как вы думаете, зачем вам два менеджера транзакций?   -  person duffymo    schedule 25.12.2009


Ответы (2)


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

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

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

Например:

@Transactional("txManager1");

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

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

person skaffman    schedule 25.12.2009
comment
прокомментируйте мое сообщение на странице stackoverflow .com / questions / 1962509 /. - person cometta; 26.12.2009
comment
я читаю из stackoverflow.com/questions/1902997/, он использует несколько org.springframework.orm.jpa.JpaTransactionManager и будет отмечен @transactional (имя). так что это нормально? - person cometta; 26.12.2009
comment
@skaffman, как я могу связать два источника данных с одним менеджером транзакций, если я использую DataSourceTransactionManager? - person tsunade21; 18.03.2011
comment
@skaffman, я работаю с шаблонами jdbc и org.apache.commons.dbcp.BasicDataSource, что мне делать, чтобы иметь transactionManager для двух источников данных? Еще раз спасибо - person tsunade21; 18.03.2011
comment
@ tsunade21: Вы открываете новый вопрос. - person skaffman; 18.03.2011
comment
@skaffman Известны ли вам какие-либо плюсы и минусы производительности при использовании JTA вместо Local JpaTransactionManager? - person svlada; 10.05.2015
comment
Обратите внимание, что в этом случае вы должны использовать org.springframework.transaction.annotation, а не javax.*. - person membersound; 20.11.2017

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

person Zoran Regvart    schedule 25.12.2009