2011-08-25 160 views
4

我有两个数据源之一为oracle和其他postgresql,并且都用于相同的业务方法。我如何我可以用弹簧@Transaction春季交易多个数据源

商业方法

@Transactional 
public int getData(){ 

oracleDao.func1(); 
postgreDao.func2(); 
} 

在配置使这种经营业务方法的事务有

<bean id="transactionManagerPostGres" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
     </bean> 
    <bean id="transactionManagerOracle" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactoryOracle"/> 
</bean>  

回答

0

你是一个two-phase commit?这是一个棘手的问题,取决于您使用的数据库和驱动程序。

+0

我想将业务方法设置为事务完全提交或回滚。 –

5

您将需要适当的JavaEE容器支持,支持两阶段提交和XA事务。 Oracle和Postgres JDBC驱动程序都支持XA事务,所以没关系。

容器通过JTA API向Spring公开这个,Spring使用那个使用JtaTransactionManager。您的应用程序无需更改,只需将其视为正常交易即可。

你怎么去设置它取决于你的JavaEE容器,每个容器都有不同的方式。

+0

我打算在servicemix上部署应用程序。 –

+0

@prabha:在这种情况下,您需要深入了解ServiceMix文档,并确定它是否具有XA JTA支持。如果没有,你需要找到另一个容器,或者找到与你拥有的东西整合在一起的容器。这是一个特定于该容器的问题,并且独立于Spring。 – skaffman

+0

我可以使@transaction注释在同一个方法中使用不同的transactionManager吗? –