Spring多个@Transactional数据源

com*_*tta 12 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" />
Run Code Online (Sandbox Code Playgroud)


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

ska*_*man 22

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

指定事务的限定符值.

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

例如:

@Transactional("txManager1");
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ tsunade21:你打开一个新问题. (4认同)
  • @skaffman,我正在使用 jdbc 模板和 org.apache.commons.dbcp.BasicDataSource,我应该怎么做才能为两个数据源使用 transactionManager?再次感谢 (2认同)