2010-12-12 3 views
54

Я новичок в Spring, и мне интересно, можно ли использовать многочисленные менеджеры транзакций в одном приложении?Spring - Можно ли использовать несколько менеджеров транзакций в одном приложении?

У меня есть два уровня доступа к данным - один для обеих баз данных. Мне интересно, как вы собираетесь использовать один менеджер транзакций для одного уровня и другой менеджер транзакций для другого уровня. Мне не нужно выполнять транзакции по обеим базам данных. Но мне нужно выполнять транзакции по каждой базе данных по отдельности. Я создал образ, чтобы помочь наметить мою проблему:

alt text

Вот моя конфигурация контекста приложения:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

    <context:component-scan base-package="cheetah.repositories" /> 
    <tx:annotation-driven /> 

    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="accounts" /> 
    </bean> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

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

</beans> 

Вот пример, который использует эту конфигурацию:

@Repository 
public class JpaAccountRepository implements AccountRepository { 

    @PersistenceContext(unitName = "cheetahAccounts") 
    private EntityManager accountManager; 

    @Override 
    @Transactional 
    public Account findById(long id) { 

     Account account = accountManager.find(Account.class, id); 
     return account; 
    } 
} 

Итак, для репозитория учетной записи я хочу использовать фабрику диспетчера сущностей с модулем сохранения, установленным для учетных записей. Однако, с моим репозиторием BusinessData, я хочу использовать фабрику управления сущностями с другой единицей сохранения. Поскольку я могу определить только один компонент менеджера транзакций, как я могу использовать разные менеджеры транзакций для разных репозиториев?

Спасибо за любую помощь.

ответ

75

Если вы используете аннотацию @Transactional, вы можете добавить specify the transaction manager to use, добавив атрибут, присвоенный имени или классификатору. Например, если ваш контекст приложения определяет несколько менеджеров транзакций с классификаторов:

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

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

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

public class TransactionalService { 

    @Transactional("account") 
    public void setSomethingInAccount() { ... } 

    @Transactional("businessData") 
    public void doSomethingInBusinessData() { ... } 
} 
+0

О том, существует ли метод, который считывает данные из базы данных, где вам не нужно использовать аннотацию @Transactional для чтения базы данных. – ziggy

+0

Спасибо за ваш ответ! но вы потеряли это '' – Dozer

5

Этой весной Jira запись обсуждается вопрос немного:

https://jira.spring.io/browse/SPR-3955

Я думаю, что это может быть один менеджер транзакций за соединение, если вы не используете двухфазной фиксации. Вам просто нужно создать двух менеджеров транзакций и ввести их с соответствующим соединением.

Но я должен задать вопрос: почему, по вашему мнению, вам нужны два менеджера транзакций? У вас может быть несколько соединений с базой данных. DAO, которые используют соединения, могут и должны быть созданы различными службами, каждый из которых может быть аннотирован с их собственными настройками транзакций. Один менеджер может разместить оба. Почему, по-вашему, вам нужны два?

+9

Я думал, что я нуждался в двух менеджеров транзакций, так как сделки manager указывает фабрику управления сущностями, которая, в свою очередь, указывает используемый блок непрерывности. –

Смежные вопросы