Spring TransactionInterceptor с несколькими TransactionManager - PullRequest
0 голосов
/ 13 февраля 2012

В веб-приложении я использую разные компоненты, которые используют Spring 3.0.x, имеющие свои DataSource и TransactionManager (все с разными именами). Все они включены в контекст через «основное» веб-приложение, включая конфигурацию Spring.

<import resource="classpath:spring-config-componentName.xml" />

В каждой из конфигураций Spring компонентов, которые я использую, декларативное управление транзакциями, включается через

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

И для каждого метода, который должен быть транзакционным, я добавляю аннотацию, которая выглядит следующим образом:

@Transactional(propagation=Propagation.REQUIRES_NEW, value="transactionManager_componentName")

Проблема, с которой я столкнулся, заключается в том, что я обнаружил, что создается только один TransactionInterceptor, который имеет ссылку на одного из менеджеров транзакций, но не на один из самого компонента. Есть ли способ справиться с этим? Хотите указать TransactionInterceptor в качестве компонента и сослаться на него в аннотации @Transactional?

Я думаю, что есть возможность, указав TransactionProxyFactoryBean в каждом компоненте и выполнив декларативное управление транзакциями через конфигурацию xml. Но это то, чего я бы хотел избежать.

Предложенный способ, описанный в документации Spring ( 10.5.6.2 Менеджеры множественных транзакций с @ Transactional ), не работает.

1 Ответ

0 голосов
/ 17 февраля 2012

Наконец я выяснил, в чем проблема, и я должен сказать, что она работает так, как описано в весенних документах.Если вы используете более одного TransactionManager в своем контейнере Spring и используете @Transaction, он не работает, если вы задаете TransactionManager следующим образом:

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

Все, что вам нужно сделать, это удалить спецификацию TransactionManager и использовать конфигурацию, подобную этой:

<!-- ========== ENABLE ANNOTATIONS  ========== -->

<tx:annotation-driven/>

<!-- ========== TRANSACTION MANAGER ========== -->

<bean id="transactionManager_component1"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource_component1" />
    <property name="nestedTransactionAllowed" value="true" />
    <qualifier value="component1"/>
</bean>

И для ваших методов, которые вы хотите запустить в транзакции, просто укажите ее следующим образом:

@Transactional(value="component1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...