【发布时间】:2014-08-21 10:27:12
【问题描述】:
我们使用 Spring 3、Hibernate 4 和 JPA 开发了两个 Web 服务(A、B)。
在服务A的方法内部,我们需要调用服务B的方法。访问是通过RMI。
问题是他们两个需要在同一个事务中。我认为我们遵循了所有处理事务的规则,但是当服务 B 中的方法被调用后服务 A 崩溃时,我们不能回滚服务 B 中的方法。
如果在调用服务B后在服务A中抛出exception,则服务A更改的数据回滚,而不是服务B更改的数据。看来事务是在服务 B 中更新,而不包括在服务 B 中创建的服务中。
我们使用在weblogic 中创建的jndi 数据源。
事务方法注释为:
*@Transactional( readOnly = false, isolation=Isolation.SERIALIZABLE,
rollbackFor=Exception.class, propagation = Propagation.REQUIRED )*
这是我处理事务的配置:
spring-server.xml(服务与服务之间唯一不同的数据是持久化单元名称):
*<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="SAPOY/SANOT" />
</bean>
<bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="allowCustomIsolationLevels" value="true"/>
<property name="globalRollbackOnParticipationFailure" value="true" />
</bean>
<tx:annotation-driven transaction-manager="jtaTransactionManager" proxy-target-class="true" />
<!-- Servicio SAPOY.SANOT -->
<bean id="sanot" class="com.sems.sapoy.sanot.services.impl.Sanot">
<property name="sanotBiz" ref="sanotBiz" />
</bean>*
persistence.xml(服务与服务之间唯一不同的数据是持久化单元名称):
*<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="SAPOY/SANOT" transaction-type="JTA">
<description>Unidad de Persistencia del modulo SANOT</description>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/xaDS</jta-data-source>
<properties>
<!--
################################################################
HIBERNATE
################################################################
-->
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.query.factory_class"
value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.autoReconnect" value="true" />
<property name="hibernate.autoReconnectForPools" value="true" />
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WeblogicTransactionManagerLookup" />
<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" />
<!--
################################################################
CONNECTION
################################################################
-->
<property name="hibernate.connection.autocommit" value="false"/>
<!--
################################################################
CACHE
################################################################
-->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.EhCacheRegionFactory" />
<property name="hibernate.cache.use_query_cache" value="true" />
</properties>
</persistence-unit>
</persistence>*
【问题讨论】:
-
您是否尝试过使用自定义
WebLogicJtaTransactionManager而不是普通的JtaTransactionManager以及如何调用 RMI 您是使用 Spring 的 RMI Remoting 还是您自己的 RMI 生成的存根?另请参阅this forum post。 -
我尝试使用 WebLogicJtaTransactionManager 但得到了相同的结果。
标签: spring hibernate transactions weblogic