Несколько поставщиков ресурсов в одной транзакции Spring

Я использую Jackrabbit для хранения файлов (хранилище данных) и Hibernate почти для всего остального. Я не знаю много транзакций и т. д., но я знаю, что мне нужна глобальная транзакция для этих двух, чтобы исключение откатывало все. На данный момент база данных откатилась, но Jackrabbit — нет.

Я использую Spring 3.2. Я развернул адаптер JCA Jackrabbit для JBoss (7.1.1). У меня есть эти строки в конфиге xml:

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

<tx:annotation-driven transaction-manager="txManager"
                      proxy-target-class="true"/>

Однако этого кажется недостаточно. Может ли кто-нибудь дать мне некоторые подсказки о том, что мне нужно прочитать/где найти информацию об этом? Мне нужно все откатить, если что-то случится с одним из поставщиков ресурсов.


person LuckyLuke    schedule 01.09.2013    source источник


Ответы (1)


Это было довольно сложно настроить. Одна ошибка заключалась в том, что Spring автоматически использует «transactionManager» в качестве имени по умолчанию, что вызывает проблемы. Это определенно стоит затраченных усилий, поскольку синхронизация несоответствующих источников данных вскоре станет кошмаром.

Вот мой пример конфигурации, которая работала для меня. Конечно, теперь мы, вероятно, будем использовать @Configuration вместо xml. Это работало с использованием Spring Data, JTA, MySQL с драйвером XA и Neo4j. Конкретные вещи Neo4j были опущены.

Spring Data также может помочь вам здесь.

Вот стартер...

<tx:annotation-driven transaction-manager="xaTransactionManager" />

<bean id="xaTransactionManager" class="some.type.of.ChainedTransactionManager">
  <constructor-arg>
    <list>
      <ref bean="jpaTransactionManager"/>
      <ref bean="otherTransactionManager"/>
    </list>
  </constructor-arg>
</bean>

<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  <property name="entityManagerFactory" ref="localContainerEntityManagerFactoryBean"/>
</bean>

<bean id="otherTransactionManager" class="other.type.of.jta.TransactionManager"> 
  <property name="transactionManager" ref="otherTransactionManagerService"/>  
</bean> 
person msduk    schedule 02.09.2013
comment
И каким будет тип ChainedTransactionManager? Это класс из Spring или что? Где я могу найти на? - person LuckyLuke; 03.09.2013
comment
И я не очень хорошо разбираюсь в транзакциях, но это не использует JBoss в качестве менеджера транзакций, верно? Как я могу сделать это весной?... что я вообще здесь делаю? Я не уверен, что понял. - person LuckyLuke; 03.09.2013
comment
Следующая ссылка может помочь немного объяснить: javaworld.com /javaworld/jw-04-2007/jw-04-xa.html - person Thierry; 03.09.2013
comment
В моем случае это был Neo4j, я ожидаю, что либо Spring Data, либо JackRabbit поставляются с ним. Нет, это работало на простом Tomcat. Вы можете подключиться к Jboss, если хотите, или, как я предпочитаю, использовать Atomikos. - person msduk; 04.09.2013