12
<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"); 如果我有多个事务管理器,我可以使用它来识别我使用的事务管理器吗?

4

2 回答 2

24

您可以@Transactional使用value属性指定要使用的 tx 管理器:

指定事务的限定符值。

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

例如:

@Transactional("txManager1");

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

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

于 2009-12-25T16:44:57.893 回答
2

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

于 2009-12-25T18:52:43.743 回答