4

我有多个数据源和一个配置了 JPA 的数据库。我正在使用 websphere 7。我希望将所有这些数据源配置为全局事务。我正在使用以下弹簧配置,但事务未按预期的全局事务工作。如果一个数据库出现故障,则另一个数据库将被提交,这不是单个全局事务。你能帮我在我做错的地方吗?

我有 2 个数据源,其中一个配置为 id="us_icfs_datasource",另一个使用 JPA

<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/persistenceUnit"/> 
    <bean id="pabpp" class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />

<!-- Needed for @Transactional annotation -->
    <tx:annotation-driven/>

<jee:jndi-lookup id="US_ICFS_DATASORCE" 
        jndi-name="jdbc/financing_tools_docgen_txtmgr"
        cache="true"
        resource-ref="true"
        proxy-interface="javax.sql.DataSource" />

我还在 web.xml 中添加了以下代码

 <persistence-unit-ref>
    <persistence-unit-ref-name>persistence/persistenceUnit</persistence-unit-ref-name>
    <persistence-unit-name>persistenceUnit</persistence-unit-name>
  </persistence-unit-ref> 

  <persistence-context-ref>
    <persistence-context-ref-name>persistence/persistenceUnit</persistence-context-ref-name>
    <persistence-unit-name>persistenceUnit</persistence-unit-name>
  </persistence-context-ref>

下面是我使用事务的代码

> @Transactional    public TemplateMapping addTemplateMapping(User user,
> TemplateMapping templateMapping)          throws
> TemplateMappingServiceException {         .... }
4

2 回答 2

4

在 Websphere 上,您应该使用此 bean 连接到 Websphere 事务管理器:

<bean id="transactionManager"
     class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>

另见这篇文章

编辑:

为了使用两阶段提交(即确保跨多个资源的一致性),您将需要使用 XA 数据源。有关详细信息,请参阅本文

于 2012-09-25T09:48:54.130 回答
0

首先,参与全局事务的数据源必须是 javax.sql.XADataSource 类型。

您还必须将持久性单元中的事务类型设置为 JTA(而不是 RESOURCE_LOCAL)。

并且您需要通知您的 JPA 实现您想要进行全局事务。

于 2012-09-25T09:34:57.010 回答