Spring JPA中的多事务管理器

Spring JPA中的多事务管理器,spring,transactionmanager,Spring,Transactionmanager,我想使用两个事务管理器,如下所示 <bean id="transactionManagerReadOnly" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactoryReadOnly" /> </bean> <bean id="tra

我想使用两个事务管理器,如下所示

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

    <bean id="transactionManagerReadWrite" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactoryReadWrite" />
    </bean>
 <tx:annotation-driven  mode="aspectj" transaction-manager="transactionManagerReadWrite"/>

  <tx:annotation-driven mode="aspectj" transaction-manager="transactionManagerReadOnly"/> 
以下是我的问题和疑问

  • 如果配置文件中存在两个事务管理器和两个
    tx:annotation-driven
    标记(如果我们没有在
    @Transactional
    注释中明确指定事务管理器的名称),那么哪个事务管理器被认为是
    @Transactional
    的有效候选对象
  • 如果建议在应用程序中只有一个
    tx:annotation-driven
    标记,并且我们仅在
    tx:annotation-driven
    标记中指定模式,那么第二个事务管理器的模式是什么? i、 springs的默认模式是代理模式,我想在aspectj模式下使用两个事务管理器
  • 如果我们只能使用一个
    tx:annotation-driven
    标记,并且spring中的默认模式是
    proxy
    模式,那么如何为第二个事务管理器指定
    aspectj
    模式

  • 您只能有一个
    ,用于配置如何处理
    @Transactional
    注释。指定模式(
    proxy
    aspectj
    )和与
    @Transactional
    注释关联的默认事务管理器

    因此,方面要么通过代理(mode
    proxy
    )应用,要么通过加载或编译时编织(mode
    aspectj
    )应用。只有一个方面,该方面要么使用默认事务管理器,要么使用
    @Transactional
    注释中定义的事务管理器

    假设您指定
    aspectj
    模式和
    transactionManagerReadWrite
    作为默认事务管理器

    
    

    现在,当使用普通的
    @Transactional
    时,它将使用
    transactionManagerReadWrite
    ,当使用
    @Transactional(“transactionManagerReadOnly”)
    时,它将使用
    transactionManagerReadOnly
    。当
    aspectj
    被用作应用事务的模式时,其中一个将被编织

    您只能有一个
    ,用于配置如何处理
    @Transactional
    注释。指定模式(
    proxy
    aspectj
    )和与
    @Transactional
    注释关联的默认事务管理器

    因此,方面要么通过代理(mode
    proxy
    )应用,要么通过加载或编译时编织(mode
    aspectj
    )应用。只有一个方面,该方面要么使用默认事务管理器,要么使用
    @Transactional
    注释中定义的事务管理器

    假设您指定
    aspectj
    模式和
    transactionManagerReadWrite
    作为默认事务管理器

    
    

    现在,当使用普通的
    @Transactional
    时,它将使用
    transactionManagerReadWrite
    ,当使用
    @Transactional(“transactionManagerReadOnly”)
    时,它将使用
    transactionManagerReadOnly
    。当
    aspectj
    被用作应用事务的模式时,其中一个将被编织

    您只能有1个
    ,并且您指定的是使用的默认事务管理器。您还可以指定要使用的模式(代理或aspectj),这将应用于所有
    @Transactional
    注释。默认情况下,除非在
    @Transactional
    注释中指定了一个tx管理器,否则它将使用默认tx管理器。@M.Deinum如何为第二个事务管理器指定aspctj模式?您不需要指定。。。模式是全局设置的,不取决于使用哪个tx manager。它所做的是如何解释
    @Transactional
    注释(代理或aspectj),与您有多少个tx管理器无关。因此,您的意思是在我的示例中,transactionManagerReadWrite的aspectj集也将应用于transactionManagerReadOnly,即使我没有在tx:annotation-driven标记中指定transactionManagerReadOnly?是的。只有一个事务特性,它使用
    @Transactional
    中指定的tx管理器,如果未指定,则使用默认值。它不依赖于应用哪种模式以及有多少个tx管理器。只有一个事务方面这一事实也是只有一个
    的原因,因为这将配置全局使用的(默认)事务管理器。您只能有一个
    ,并且您指定的是使用的默认事务管理器。您还可以指定要使用的模式(代理或aspectj),这将应用于所有
    @Transactional
    注释。默认情况下,除非在
    @Transactional
    注释中指定了一个tx管理器,否则它将使用默认tx管理器。@M.Deinum如何为第二个事务管理器指定aspctj模式?您不需要指定。。。模式是全局设置的,不取决于使用哪个tx manager。它所做的是如何解释
    @Transactional
    注释(代理或aspectj),与您有多少个tx管理器无关。因此,您的意思是在我的示例中,transactionManagerReadWrite的aspectj集也将应用于transactionManagerReadOnly,即使我没有在tx:annotation-driven标记中指定transactionManagerReadOnly?是的。只有一个事务特性,它使用
    @Transactional
    中指定的tx管理器,如果未指定,则使用默认值。它不依赖于应用哪种模式以及有多少个tx管理器。只有一个事务方面这一事实也是只有一个
    的原因,因为它将配置全局使用的(默认)transaction manager.so aspectj模式将同时应用于两个事务管理器,即transactionManagerReadWrite和TransactionManagerReadOnly。该模式与事务管理器无关。。。只有一个组件正在应用
    @Transactional("transactionManagerReadWrite")
    @Transactional("transactionManagerReadOnly")