복붙노트

[SPRING] 2 개의 트랜잭션 관리자로 @EnableTransactionManagement 주석

SPRING

2 개의 트랜잭션 관리자로 @EnableTransactionManagement 주석

@Configuration annotation을 XML 파일 대신 Spring의 설정으로 사용하고 있습니다. 다른 세션 팩토리와 다른 트랜잭션 관리자로 2 개의 데이터 소스를 구성하려고합니다. @EnableTransactionManagement 주석에 대한 문제가 여기에 붙어 있습니다. 나는 그것의 문서에서,

즉, 메소드에 부여하는 이름은 무엇이든간에, 두 개의 트랜잭션 관리자가있는 동안 항상 PlatformTransactionManager 객체를 반환하는 메소드를 검색합니다. 이제 문제는이 클래스를 테스트 할 때 오류가 발생한다는 것입니다.

나는 2 개의 다른 Configuration 클래스를 가지고 있지만 헛되이 시도했다. xml 구성에서 이것은 사실이 아닙니다. 두 개의 트랜잭션 관리자를 두 개의 태그로 등록 했으므로 제대로 작동했습니다. 하지만 주석으로 여기서는 동일하게 할 수 없습니다.

Spring 어노테이션 구성 클래스에서 2 개의 다른 트랜잭션 관리자로 2 개의 데이터 소스를 구성하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.구성 클래스에서 @EnableTransactionManagement 주석을 사용하십시오.

    구성 클래스에서 @EnableTransactionManagement 주석을 사용하십시오.

    이 클래스의 트랜잭션 관리자를 다음과 같이 정의하십시오.

        @Bean(name="txName")
        public HibernateTransactionManager txName() throws IOException{
            HibernateTransactionManager txName= new HibernateTransactionManager();
            txName.setSessionFactory(...);
            txName.setDataSource(...);
            return txName;
       }
    

    거기에, 트랜잭션 작업을 실행하는 클래스 / 메소드에서 다음과 같이 주석을 달아 라.

    @Transactional("txName")
    

    또는

    @Transactional(value = "txName")
    

    이렇게하면 필요한 자격을 갖춘 트랜잭션 관리자를 원하는 곳에 연결할 수 있습니다. 이제 원하는만큼 많은 트랜잭션 관리자를 보유 할 수 있으므로 필요에 따라 적절하게 사용할 수 있습니다.

  2. ==============================

    2.누구나이 문제에 부딪 힐 경우를 대비해 해결책을 찾았습니다.

    누구나이 문제에 부딪 힐 경우를 대비해 해결책을 찾았습니다.

    @Configuration
    @EnableTransactionManagement
    @DependsOn("myTxManager")
    @ImportResource("classpath:applicationContext.xml")
    public class AppConfig implements TransactionManagementConfigurer {
    
    @Autowired
    private PlatformTransactionManager myTxManager;
    
    ...
    
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return this.myTxManager;
    }
    

    이 방법으로 xml 구성에 정의 된 특정 txManager를 사용할 수 있습니다.

    서비스 수준에서 사용되는 txManager를 정의하려는 경우 @Configuration 클래스에서 @EnableTransactionManagement 주석을 제거하고 @Transactional 주석에 txManager를 지정해야합니다. 예 :

    @Service
    @Transactional(value="myTxManager", readOnly = true)
    public class MyServiceImpl implements MyService { ... }
    
  3. ==============================

    3.자바 문서에서

    자바 문서에서

    귀하의 @Configuration 클래스는 TransactionManagementConfigurer 인터페이스를 구현해야합니다 - 사용할 transactionManager에 대한 참조를 반환하는 annotationDrivenTransactionManager를 구현하십시오.

  4. ==============================

    4.두 TransactionManagers를 왜 사용하는지 확신 할 수 없습니다. AbstractRoutingDataSource를 통해 여러 데이터 소스에 동일한 TransactionManager를 사용할 수 있습니다. 참조하시기 바랍니다

    두 TransactionManagers를 왜 사용하는지 확신 할 수 없습니다. AbstractRoutingDataSource를 통해 여러 데이터 소스에 동일한 TransactionManager를 사용할 수 있습니다. 참조하시기 바랍니다

    http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/

    그 사용법에 대한 샘플.

  5. ==============================

    5.다른 대답 중 일부는 두 트랜잭션 관리자를 사용하는 것이 어떤 식 으로든 잘못되었음을 암시합니다. 그러나 Spring의 XML 설정은 온라인 문서 (아래)에서 언급 한 것처럼 여러 트랜잭션 관리자를 사용할 수있게한다. 불행히도 @EnableTransactionManagement 주석을 비슷한 방식으로 작동시키는 방법이없는 것처럼 보입니다. 따라서 @ImportResource 주석을 사용하여 행을 포함하는 XML 파일을로드하기 만하면됩니다. 이를 통해 대부분의 Java 구성을 가져올 수 있지만 선택적 Transaction Manager 한정자를 사용하여 @Transactional을 계속 사용할 수 있습니다.

    다른 대답 중 일부는 두 트랜잭션 관리자를 사용하는 것이 어떤 식 으로든 잘못되었음을 암시합니다. 그러나 Spring의 XML 설정은 온라인 문서 (아래)에서 언급 한 것처럼 여러 트랜잭션 관리자를 사용할 수있게한다. 불행히도 @EnableTransactionManagement 주석을 비슷한 방식으로 작동시키는 방법이없는 것처럼 보입니다. 따라서 @ImportResource 주석을 사용하여 행을 포함하는 XML 파일을로드하기 만하면됩니다. 이를 통해 대부분의 Java 구성을 가져올 수 있지만 선택적 Transaction Manager 한정자를 사용하여 @Transactional을 계속 사용할 수 있습니다.

    http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/transaction.html

  6. ==============================

    6.체인 트랜잭션 관리자를 사용해보십시오.

    체인 트랜잭션 관리자를 사용해보십시오.

    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.transaction.ChainedTransactionManager;
    import org.springframework.transaction.PlatformTransactionManager;
    
    @Configuration
    public class ChainedDBConfig {
    
        @Bean("chainedTransactionManager")
        public PlatformTransactionManager transactionManager(
                @Qualifier("database1TransactionManager") final PlatformTransactionManager db1PlatformTransactionManager,
                @Qualifier("database2TransactionManager") final PlatformTransactionManager db2PlatformTransactionManager) {
    
            return new ChainedTransactionManager(db1PlatformTransactionManager, db2PlatformTransactionManager);
        }
    
    }
    

    서비스 클래스에 다음 주석을 추가하십시오.

    @Transactional(transactionManager = "chainedTransactionManager")
    public class AggregateMessagesJobIntegrationTest {
       ...
    }
    

    통합 테스트에서 사용할 수도 있습니다.

    @RunWith(SpringRunner.class)
    @Transactional(transactionManager = "chainedRawAndAggregatedTransactionManager")
    @Rollback
    public class ExampleIntegrationTest extends AbstractIntegrationTest {
        ....
    }
    

    두 DB 트랜잭션 관리자 모두에게 롤백을 수행합니다.

  7. from https://stackoverflow.com/questions/8050183/enabletransactionmanagement-annotation-with-2-transaction-managers by cc-by-sa and MIT license