【发布时间】:2019-09-25 09:28:12
【问题描述】:
我想使用如下两个事务管理器
<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 标签,如下所示
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManagerReadWrite"/>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManagerReadOnly"/>
但我在某处读到应该只有一个 tx:annotation-driven 存在,并通过在 @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模式?
【问题讨论】:
-
您只能拥有 1 个
<tx:annotation-driven />,并且您在此处指定的是使用的默认事务管理器。您还指定要使用的模式(代理或方面j)这将应用于所有@Transactional注释。默认情况下,它将使用默认的 tx 管理器除非在@Transactional注释中指定了一个。 -
@M.Deinum 如何为第二个事务管理器指定 aspctj 模式?
-
你不需要指定...模式是全局设置的,不依赖于使用哪个 tx manager。它的作用是如何解释
@Transactional注解,无论是proxy还是aspectj,与你有多少tx manager无关。 -
所以你的意思是说在我的情况下为 transactionManagerReadWrite 设置的 aspectj 也将应用于 transactionManagerReadOnly 即使我没有在 tx:annotation 驱动标签中指定 transactionManagerReadOnly ?
-
是的。只有一个事务方面,它使用
@Transactional中指定的 tx 管理器,如果没有指定,则使用默认值。它不依赖于应用哪种模式的 tx 管理器和多少个 tx 管理器。只有一个事务方面的事实也是只能有一个<tx:annotation-driven />的原因,因为它将配置全局使用的(默认)事务管理器。