Spring多个@Transactional数据源

时间:2009-12-25 15:52:24

标签: java spring jpa transactional

<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");来识别我使用的事务管理器吗?

2 个答案:

答案 0 :(得分:21)

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

  

指定的限定符值   事务。

     

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

例如:

@Transactional("txManager1");

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

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

答案 1 :(得分:2)

更多关于需要多个事务管理器的信息。您可能尝试按顺序执行嵌套或单独的事务 - 然后您可以使用不同的传播设置。您可以使用单个事务管理器配置Transaction propagation

来实现