我有多个数据源和一个配置了JPA的数据库。我正在使用websphere 7.我希望将所有这些数据配置为全局事务。我在弹簧配置下使用,但交易没有按预期的全局交易工作。如果一个数据库失败,那么另一个数据库将被提交,这不会被视为单个全局事务。你可以帮我解决我做错的事吗,
我有两个数据如下配置id =“us_icfs_datasource”而另一个使用JPA
<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/persistenceUnit"/>
<bean id="pabpp" class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<!-- Needed for @Transactional annotation -->
<tx:annotation-driven/>
<jee:jndi-lookup id="US_ICFS_DATASORCE"
jndi-name="jdbc/financing_tools_docgen_txtmgr"
cache="true"
resource-ref="true"
proxy-interface="javax.sql.DataSource" />
我也在web.xml中添加了以下代码
<persistence-unit-ref>
<persistence-unit-ref-name>persistence/persistenceUnit</persistence-unit-ref-name>
<persistence-unit-name>persistenceUnit</persistence-unit-name>
</persistence-unit-ref>
<persistence-context-ref>
<persistence-context-ref-name>persistence/persistenceUnit</persistence-context-ref-name>
<persistence-unit-name>persistenceUnit</persistence-unit-name>
</persistence-context-ref>
下面是我使用交易
的代码> @Transactional public TemplateMapping addTemplateMapping(User user,
> TemplateMapping templateMapping) throws
> TemplateMappingServiceException { .... }
答案 0 :(得分:4)
在Websphere上,您应该使用此bean挂钩到Websphere事务管理器:
<bean id="transactionManager"
class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>
另见article
编辑:
为了使用两阶段提交(即确保跨多个资源的一致性),您将需要使用XA数据源。有关详细信息,请参阅this article。
答案 1 :(得分:0)
首先,参与全局事务的数据源必须是javax.sql.XADataSource类型。
您还必须将持久性单元中的事务类型设置为JTA(而不是RESOURCE_LOCAL)。
您需要告知您的JPA实施您想要进行全球交易。