【问题标题】:Multiple Transaction managers in Spring JPASpring JPA 中的多个事务管理器
【发布时间】: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")

以下是我的问题和疑问

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

【问题讨论】:

  • 您只能拥有 1 个&lt;tx:annotation-driven /&gt;,并且您在此处指定的是使用的默认事务管理器。您还指定要使用的模式(代理或方面j)这将应用于所有@Transactional 注释。默认情况下,它将使用默认的 tx 管理器除非@Transactional 注释中指定了一个。
  • @M.Deinum 如何为第二个事务管理器指定 aspctj 模式?
  • 你不需要指定...模式是全局设置的,不依赖于使用哪个 tx manager。它的作用是如何解释@Transactional注解,无论是proxy还是aspectj,与你有多少tx manager无关。
  • 所以你的意思是说在我的情况下为 transactionManagerReadWrite 设置的 aspectj 也将应用于 transactionManagerReadOnly 即使我没有在 tx:annotation 驱动标签中指定 transactionManagerReadOnly ?
  • 是的。只有一个事务方面,它使用@Transactional 中指定的 tx 管理器,如果没有指定,则使用默认值。它不依赖于应用哪种模式的 tx 管理器和多少个 tx 管理器。只有一个事务方面的事实也是只能有一个 &lt;tx:annotation-driven /&gt; 的原因,因为它将配置全局使用的(默认)事务管理器。

标签: spring transactionmanager


【解决方案1】:

您只能拥有一个 &lt;tx:annotation-driven /&gt;,因为它配置了 @Transactional 注释的处理方式。您指定模式(proxyaspectj)以及与 @Transactional 注释关联的默认事务管理器。

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

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

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

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

【讨论】:

  • so aspectj 模式将应用于两个事务管理器,即 transactionManagerReadWrite 和 transactionManagerReadOnly
  • 该模式与事务管理器无关...只有一个组件将事务应用于事务方面。模式指定了如何应用...
  • 收到感谢您的信息。你有任何可用的文档链接吗?
猜你喜欢
  • 2018-10-24
  • 2010-09-09
  • 2019-01-24
  • 1970-01-01
  • 2012-09-03
  • 2018-12-30
  • 2017-12-23
  • 2019-02-24
相关资源
最近更新 更多