【问题标题】:Spring multiple @Transactional datasourcesSpring多个@Transactional数据源
【发布时间】:2010-12-30 00:03:20
【问题描述】:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="data.emf" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />


<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="data.emf" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager2" />


在我的服务层中,如果我有多个事务管理器,我可以使用@Transactional(name="transactionManager2"); 来识别我使用哪个事务管理器吗?

【问题讨论】:

  • 您认为为什么需要两个事务管理器?

标签: java spring jpa transactional


【解决方案1】:

您可以使用 value attribute 指定与 @Transactional 一起使用的 tx 管理器:

指定的限定符值 交易。

可用于确定目标 事务管理器,匹配 限定符值(或 bean 名称) 特定的 PlatformTransactionManager bean 定义。

例如:

@Transactional("txManager1");

或者,您可以使用更明确的TransactionProxyFactoryBean,它可以让您更精细地控制哪些对象由哪些 tx 管理器代理。这仍然使用注释,但它不会自动检测 bean,它是在逐个 bean 的基础上显式配置的。

这通常不是问题,但拥有多个事务管理器并不明智,除非您有充分的理由这样做。如果您发现自己需要两个 tx 管理器,通常最好看看是否可以凑合使用一个。例如,如果您在应用服务器中配置了两个数据源,则可以将它们合并到一个 JtaTransactionManager 中,而不是两个单独的 JpaTransactionManagerDataSourceTransactionmanagers

【讨论】:

【解决方案2】:

更多关于需要多个事务管理器的信息。您可能正在尝试按顺序执行嵌套或单独的事务——然后您可以使用不同的传播设置。您可以通过使用单个事务管理器的配置来实现这一点,请参阅Transaction propagation

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 2020-06-21
    • 1970-01-01
    • 2016-06-02
    • 2011-05-10
    • 2018-08-20
    • 2017-07-19
    • 1970-01-01
    • 2019-07-21
    相关资源
    最近更新 更多