Менеджер транзакций не принимает транзакцию - PullRequest
2 голосов
/ 17 мая 2011

Я столкнулся с проблемой, я действительно не знаю, как поймать хвост кошки (если вы дадите мне шутку: о))

У меня есть веб-приложение на войне, развертывание в Tomcat. война содержит 4 банки. 4 банки имеют 4 applicationContext, 4 entityManager и 4 TransactionManager.

объявить, как это (изменить номер 1 ..):

      <bean id="entityManagerFactory1" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    p:dataSource-ref="dataSource1"
    p:persistence-unit-name="com.xxxxxx.domain"     >

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
        p:databasePlatform="${ds1.dbdialect}" p:generate-ddl="false"
            p:showSql="${ds1.showsql}"  />
    </property>
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
</bean>

  <bean id="transactionManager1" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory1">
    depends-on="entityManagerFactory1" name="transactionManager1"/>


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

контекст загружается так:

моя проблема, я обнаружил, что когда я использую BO 3, транзакция открыта с источником данных 2.

Более того, если я настаиваю, у меня появляется сообщение:

AbstractSaveEventListener - задержка вставки идентификатора из-за отсутствия транзакции

НО, если я запускаю jar 1 один (например), все работает отлично.

Большое спасибо за ваше просветление.

1 Ответ

2 голосов
/ 17 мая 2011

Позвольте мне угадать:

в вашем servlet-context.xml, вы импортируете контексты?Например:

<import location="classpath:context1.xml" />
<import location="classpath:context2.xml" />

и т. д.

Если вы это сделаете, все определения компонентов будут скопированы из импортированного контекста в корневой контекст, что означает, что у вас есть четыре разных объявления <tx:annotation-driven /> сразные менеджеры транзакций.Вероятно, победит последний.

Возможные решения: либо используйте квалификаторы , либо используйте XML-стиль объявления транзакции .

Что бы я сделалВероятно, для ввода пользовательской аннотации @Transactional для контекста:

@Transactional("tx1")
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Transactional1 {}

Теперь аннотируйте все методы в банке 1 с @Transactional1, в банке 2 с @Transactional2 и т. д. Этот механизм описан в разделе 10.5.6.3 Пользовательские ярлыки аннотаций

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...