Транзакция Spring JTA с источником данных JPA и jndi для Websphere

У меня есть несколько источников данных и одна база данных, настроенная с помощью JPA. Я использую websphere 7. Я хочу, чтобы все эти источники данных были настроены как глобальные транзакции. Я использую приведенные ниже конфигурации Spring, но транзакции не работают, как ожидалось, глобальная транзакция. Если один db дает сбой, то другой db фиксируется, что не ожидается как отдельные глобальные транзакции. Не могли бы вы помочь мне, где я делаю неправильно,

У меня есть 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 {         .... }

person Foram Parikh    schedule 25.09.2012    source источник


Ответы (2)


В Websphere вы должны использовать этот bean-компонент для подключения к менеджеру транзакций Websphere:

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

См. также эту статью.

РЕДАКТИРОВАТЬ:

Чтобы использовать двухэтапную фиксацию (т. е. обеспечение согласованности между несколькими ресурсами), вам потребуется использовать источники данных XA. Подробнее см. в этой статье.

person beny23    schedule 25.09.2012
comment
Также у нас может быть два разных диспетчера транзакций, один с именем transactionManager, а другой с именем wsTransactionManager, чтобы только один из моих bean-компонентов использовал wsTransactionManager, а остальные автоматически принимали transactionManager - person Foram Parikh; 25.09.2012
comment
Почему вы хотите использовать два разных bean-компонента txn manager? В конце концов, менеджер txn Websphere будет использоваться независимо от того, используете ли вы JTATransactionManager или WebSphereUowTransactionManager, bean-компонент UOW просто позволяет вам лучше использовать функции websphere под капотом... - person beny23; 25.09.2012
comment
Эй, большое спасибо за решение перейти на WebshphereUowTransactionManager, но если я перейду на websphereuowtransactionmanger, я все равно не получу откат, как ожидалось. Одна база данных фиксируется, хотя мое исключение возвращается из второй базы данных. Ниже мой код - person Foram Parikh; 25.09.2012
comment
Чтобы использовать двухэтапную фиксацию, вам необходимо убедиться, что оба источника данных настроены как источники данных XA в веб-сфере (см. также ссылку, которую я добавил в свой ответ). Если вы хотите добавить код, я бы отредактировал вопрос выше. - person beny23; 25.09.2012
comment
да. Было бы хорошо, если бы вы предоставили какой-нибудь фрагмент. Потому что, если я использую XADatasource, то приведенный ниже код не работает... class JFFS00AStoredProcedure extends StoredProcedure { public JFFS00AStoredProcedure (DataSource dataSource, String spName) { super (dataSource, spName);.....} здесь класс Spring StoredProcedure может использовать только источник данных не XADataSource - person Foram Parikh; 25.09.2012
comment
да, пожалуйста, вопрос о SO всегда должен быть автономным, а не охватывать несколько тем. - person beny23; 25.09.2012

Прежде всего, ваши источники данных, участвующие в глобальной транзакции, должны иметь тип javax.sql.XADataSource.

Вы также должны установить тип транзакции в вашем блоке сохраняемости на JTA (не RESOURCE_LOCAL).

И вам нужно сообщить вашей реализации JPA, что вы хотите выполнять глобальные транзакции.

person František Hartman    schedule 25.09.2012
comment
Как мне это сделать, и вам нужно сообщить своей реализации JPA, что вы хотите выполнять глобальные транзакции? и если я перейду ниже на источник данных XA, то моя хранимая процедура на основе весны не работает /› - person Foram Parikh; 25.09.2012
comment
Какую реализацию JPA вы используете? - person František Hartman; 26.09.2012