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
注释关联的默认事务管理器
因此,方面要么通过代理(modeproxy
)应用,要么通过加载或编译时编织(modeaspectj
)应用。只有一个方面,该方面要么使用默认事务管理器,要么使用@Transactional
注释中定义的事务管理器
假设您指定aspectj
模式和transactionManagerReadWrite
作为默认事务管理器
现在,当使用普通的
@Transactional
时,它将使用transactionManagerReadWrite
,当使用@Transactional(“transactionManagerReadOnly”)
时,它将使用transactionManagerReadOnly
。当aspectj
被用作应用事务的模式时,其中一个将被编织 您只能有一个
,用于配置如何处理@Transactional
注释。指定模式(proxy
或aspectj
)和与@Transactional
注释关联的默认事务管理器
因此,方面要么通过代理(modeproxy
)应用,要么通过加载或编译时编织(modeaspectj
)应用。只有一个方面,该方面要么使用默认事务管理器,要么使用@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")