How to configure transaction management for working with 2 different db in Spring?

前端 未结 4 757
无人共我
无人共我 2020-12-02 10:49

I have 2 databases (MySql and HSQLDB). I configured 2 data sources and 2 EntityManagerFactory beans. I can also configure 2 correspondent JpaTransactionManager beans.

相关标签:
4条回答
  • 2020-12-02 11:02

    Since its after a longtime since the correct answers.

    Skaffman may be correct in terms of usability of JpaTransactionManager for multiple databases.

    But there is working solution for using 2 different databases with 2 different JpaTransactionManager.

      @Bean(name = "db2TransactionManager")
      public PlatformTransactionManager transactionManager2() throws NamingException {
        JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
        return txManager;
      }
    
      @Bean
      @Primary
      public PlatformTransactionManager transactionManager() throws Exception {
         JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
        txManager.setNestedTransactionAllowed(true);
        return txManager;
      }
    

    @Primary should be used to specify for the ones where you don't specify qualifier name in @Transactional

    0 讨论(0)
  • 2020-12-02 11:19

    The javadoc for JpaTransactionManager has some advice on this:

    This transaction manager is appropriate for applications that use a single JPA EntityManagerFactory for transactional data access. JTA (usually through JtaTransactionManager) is necessary for accessing multiple transactional resources within the same transaction. Note that you need to configure your JPA provider accordingly in order to make it participate in JTA transactions.

    In other words, if you find yourself with multiple entity managers, with corresponding tx managers, then you should consider using a single JtaTransactionManager instead. The entity managers should be able to participate in JTA transactions, and this will give you full transactionality across both entity managers, without hacving to worry about which entity manager you're in at any one time.

    Of course, JtaTransactionManager does require a full JTA-supporting application server, rather than a vanilla servlet engine like Tomcat.

    0 讨论(0)
  • 2020-12-02 11:25

    Declare your <tx:annotation-driven> without transaction-manager attribute, declare qualifiers for transaction managers like this:

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

    Use this qualifier in @Transactional as a value to select one of transaction managers:

    @Transactional("txManager1")
    

    or, with more properties:

    @Transactional(value = "txManager1", readOnly = true)   
    
    0 讨论(0)
  • 2020-12-02 11:28

    You have to specify two transaction managers for that in application-context.xml as below:

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

    @Transactional attribute will now use its relevant transaction manager.

    0 讨论(0)
提交回复
热议问题