4

JPAで構成された複数のデータソースと1つのデータベースがあります。私は websphere 7 を使用しています。これらすべてのデータソースをグローバル トランザクションとして構成したいと考えています。以下のスプリング構成を使用していますが、トランザクションが期待どおりのグローバル トランザクションとして機能していません。1 つのデータベースが失敗した場合、他のデータベースがコミットされますが、これは単一のグローバル トランザクションとしては想定されていません。私が間違っているところを教えてください。

以下に id="us_icfs_datasource" で構成された 2 つのデータソースと、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"/>

こちらの記事もご覧ください

編集:

2 フェーズ コミットを使用する (つまり、複数のリソース間で一貫性を確保する) には、XA データ ソースを使用する必要があります。詳しくはこちらの記事をご覧ください。

于 2012-09-25T09:48:54.130 に答える
0

まず、グローバルトランザクションに参加するデータソースは、javax.sql.XADataSourceタイプである必要があります。

また、永続性ユニットのトランザクションタイプをJTA(RESOURCE_LOCALではない)に設定する必要があります。

また、グローバルトランザクションを実行することをJPA実装に通知する必要があります。

于 2012-09-25T09:34:57.010 に答える