prosource

봄 - 동일한 애플리케이션에서 여러 트랜잭션 관리자를 사용할 수 있습니까?

probook 2023. 8. 1. 20:37
반응형

봄 - 동일한 애플리케이션에서 여러 트랜잭션 관리자를 사용할 수 있습니까?

저는 스프링이 처음인데 같은 애플리케이션에서 여러 트랜잭션 관리자를 사용할 수 있는지 궁금합니다.

두 개의 데이터 액세스 계층이 있습니다. 하나는 두 데이터베이스 모두에 대한 것입니다.한 계층에 한 트랜잭션 관리자를 사용하고 다른 계층에 다른 트랜잭션 관리자를 사용하는 방법이 궁금합니다.아직 두 데이터베이스 모두에서 트랜잭션을 수행할 필요가 없습니다.그러나 각 데이터베이스에 대해 개별적으로 트랜잭션을 수행해야 합니다.문제의 개요를 설명하는 데 도움이 되는 이미지를 만들었습니다.

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;
    }
}

그래서 계정 저장소의 경우 지속성 단위가 계정으로 설정된 엔티티 관리자 팩토리를 사용하려고 합니다.그러나 Business Data Repository에서는 지속성 단위가 다른 엔티티 관리자 팩토리를 사용하려고 합니다.트랜잭션 관리자 빈을 하나만 정의할 수 있기 때문에 저장소마다 다른 트랜잭션 관리자를 사용하려면 어떻게 해야 합니까?

도와주셔서 감사합니다.

사용하는 위치@Transactional주석. 빈 이름 또는 한정자에 속성 집합을 추가하여 사용할 트랜잭션 관리자를 지정할 수 있습니다.예를 들어, 응용 프로그램 컨텍스트에서 한정자가 있는 여러 트랜잭션 관리자를 정의하는 경우:

<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() { ... }
}

이 Spring Jira 항목에서는 이 문제에 대해 약간 설명합니다.

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

2단계 커밋을 사용하지 않을 경우 연결당 트랜잭션 관리자가 한 명일 수 있습니다.두 개의 트랜잭션 관리자를 생성하고 적절한 연결을 주입하면 됩니다.

하지만 저는 질문을 해야 합니다: 왜 당신은 트랜잭션 관리자가 필요하다고 생각하십니까?둘 이상의 데이터베이스 연결을 가질 수 있습니다.연결을 사용하는 DAO는 서로 다른 서비스에 의해 인스턴스화될 수 있으며, 각 서비스는 고유한 트랜잭션 설정으로 주석을 달 수 있습니다.매니저 한 명이 둘 다 수용할 수 있습니다.왜 두 개가 필요하다고 생각하십니까?

언급URL : https://stackoverflow.com/questions/4423125/spring-is-it-possible-to-use-multiple-transaction-managers-in-the-same-applica

반응형