我想使用两个事务管理器,如下所示
<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:注释驱动的标签,如下所示
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManagerReadWrite"/>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManagerReadOnly"/>
但我在某处读到应该只有一个 tx:注释驱动的存在,并通过在@Transaction标签中指定(例如 folows(来引用另一个事务管理器
@Transactional("transactionManagerReadWrite")
@Transactional("transactionManagerReadOnly")
以下是我的问题和疑问
- 如果我们没有在注释
@Transactional
中明确指定事务管理器的名称,则配置文件中存在两个事务管理器和两个tx:annotation-driven
标记,则哪个事务管理器被视为@Transactional
的有效候选者? - 如果建议在应用程序中只有一个
tx:annotation-driven
标签,并且我们仅在tx:annotation-driven
标签中指定模式,那么第二个事务管理器的模式是什么? 即 springs 默认模式是代理模式,我想使用两个带有 aspectj 模式的事务管理器 - 如果我们只能使用一个
tx:annotation-driven
标签并且默认模式是 Spring 中的proxy
模式,如何为第二个事务管理器指定aspectj
模式?
您只能有一个<tx:annotation-driven />
,因为它配置了@Transactional
注释的处理方式。指定模式(proxy
或aspectj
(和要与@Transactional
注释关联的默认事务管理器。
因此,这方面要么通过代理(模式proxy
(应用,要么通过加载或编译时编织(模式aspectj
(应用。只有一个方面,该方面要么使用默认事务管理器,要么使用@Transactional
注释中定义的事务管理器。
假设您将aspectj
模式和transactionManagerReadWrite
指定为默认事务管理器
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManagerReadWrite"/>
现在,当使用普通@Transactional
时,它将使用transactionManagerReadWrite
,当使用@Transactional("transactionManagerReadOnly")
时,它将使用transactionManagerReadOnly
。任何一个都将被编织aspectj
用作应用事务的模式。