Spring JPA 中的多个事务管理器



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

<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")

以下是我的问题和疑问

  1. 如果我们没有在注释@Transactional中明确指定事务管理器的名称,则配置文件中存在两个事务管理器和两个tx:annotation-driven标记,则哪个事务管理器被视为@Transactional的有效候选者?
  2. 如果建议在应用程序中只有一个tx:annotation-driven标签,并且我们仅在tx:annotation-driven标签中指定模式,那么第二个事务管理器的模式是什么? 即 springs 默认模式是代理模式,我想使用两个带有 aspectj 模式的事务管理器
  3. 如果我们只能使用一个tx:annotation-driven标签并且默认模式是 Spring 中的proxy模式,如何为第二个事务管理器指定aspectj模式?

您只能有一个<tx:annotation-driven />,因为它配置了@Transactional注释的处理方式。指定模式(proxyaspectj(和要与@Transactional注释关联的默认事务管理器。

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

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

<tx:annotation-driven  mode="aspectj" transaction-manager="transactionManagerReadWrite"/>

现在,当使用普通@Transactional时,它将使用transactionManagerReadWrite,当使用@Transactional("transactionManagerReadOnly")时,它将使用transactionManagerReadOnly。任何一个都将被编织aspectj用作应用事务的模式。

相关内容

  • 没有找到相关文章

最新更新