首页 > 解决方案 > 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: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只在标签中指定模式,那么第二个事务管理器的模式是什么?即弹簧默认模式是代理模式,我想使用两个事务管理器的aspectj模式
  3. aspectj如果我们只能使用一个tx:annotation-driven标签并且默认模式是proxyspring 模式,如何为第二个事务管理器指定模式?

标签: springtransactionmanager

解决方案


您只能有一个<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应用交易的模式。


推荐阅读