事务管理器不承担该事务

时间:2011-05-17 10:16:53

标签: java spring jpa spring-transactions spring-orm

我正面临着一个问题,我真的不知道如何抓住猫尾巴(如果你让我开玩笑的话:o))

我有一个战争中的webapp,在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 个答案:

答案 0 :(得分:2)

让我猜一下:

在你的servlet-context.xml中,你导入了上下文吗? e.g:

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

如果这样做,所有bean定义都会从导入的上下文复制到根上下文中,这意味着您有四个不同的<tx:annotation-driven />声明,具有不同的事务管理器。可能是最后一个获胜。

可能的解决方案:use Qualifiersuse the XML style of transaction declaration

我要做的可能是为每个上下文引入自定义@Transactional注释:

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

现在使用@Transactional1在jar 1中注释jar {1}}中的所有方法,并在10.5.6.3 Custom shortcut annotations

部分中记录此机制。