【问题标题】:No Transaction in Progress JTA Transaction没有进行中的交易 JTA 交易
【发布时间】:2012-02-16 18:13:36
【问题描述】:

我是 JTA 的新手,我想在我的应用程序中进行两阶段提交,这将连接到两个不同的数据库模式。 我在我的应用程序中使用 Spring、Hibernate 和 JPA,我想添加 JTA 事务管理器以开始,但我无法通过这个。

谁能帮我解决我面临的问题,或者指出我的配置或理解有什么问题。

这是我在配置文件中的设置

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="LineManagement" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="false" />
            <property name="databasePlatform" value="${hibernate.dialect}" />
        </bean>
    </property>
    <property name="beanName" value="entityManager"></property>
</bean>

<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"
    init-method="init" depends-on="setAtomikosSystemProps">
    <constructor-arg>
        <props>
            <prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory</prop>
        </props>
    </constructor-arg>
</bean> 


<bean id="setAtomikosSystemProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetClass" value="java.lang.System" />
            <property name="targetMethod" value="getProperties" />
        </bean>
    </property>
    <property name="targetMethod" value="putAll" />
    <property name="arguments">
        <util:properties>
            <prop key="com.atomikos.icatch.file">/jta.properties</prop>
            <prop key="com.atomikos.icatch.hide_init_file_path">true</prop>
            <prop key="com.atomikos.icatch.console_log_level">DEBUG</prop>
        </util:properties>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" >
        <property name="userTransaction" ref="AtomikosUserTransaction" /> 
        <property name="transactionManager" ref="AtomikosTransactionManager" /> 
</bean>


<bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" depends-on="userTransactionService" >
    <property name="transactionTimeout" value="300"/>
</bean> 

<bean id="AtomikosTransactionManager" class = "com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
   <property name="forceShutdown" value="false" /> 
</bean>


<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

persistence.xml有如下配置

<persistence-unit name="LineManagement" transaction-type="JTA">

    <properties>
        <property name="hibernate.id.new_generator_mappings" value="true" />
        <property name="hibernate.current_session_context_class" value="thread" />
        <property name="hibernate.default_batch_fetch_size" value="200" />
        <property name="hibernate.transaction.manager_lookup_class" value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/>
        <property key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
        <!-- General Debugging -->
        <property name="hibernate.show_sql" value="false" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.generate_statistics" value="true" />

    </properties>
</persistence-unit>

当我运行应用程序时,它给了我一个异常 org.springframework.dao.InvalidDataAccessApiUsageException:没有事务正在进行;嵌套异常是 javax.persistence.TransactionRequiredException: no transaction is in progress

我试图用 @Transactional 注释上的传播标志来解决问题,因为我相信这个异常表明不存在事务,但它并没有使错误消失......

【问题讨论】:

  • 也许&lt;tx:annotation-driven/&gt; 会有所帮助?
  • 我的配置中有这个。我指的是稍后指定的 transactionManger
  • 在 JBoss 上,我设法使类似的配置仅在删除后才能工作: org.hibernate.transaction.JTATransactionFactory 在此之前一切正常(包括 2 阶段提交)除了 entitymanager 的持久/合并/删除方法。为什么?我不知道:(

标签: hibernate spring jpa jta


【解决方案1】:

尝试将@Transactional"Required" 放在服务(或持久层)调用之前。确保您使用的事务管理器与声明的休眠事务管理器查找类所查找的事务管理器相同。

基本上,您的 spring 事务拦截器应该在您执行任何需要事务的数据库操作之前启动事务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2011-01-21
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多