JTA和Hibernate事务管理

问题描述

我们已经实现了spring消息侦听器服务,该服务公开的主要操作是多事件驱动的数据库更新。

上下文如下所示。

   <bean id="consumerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="concurrentConsumers" value="${jms.consumerContainer.concurrentconsumers}"/>
        <property name="maxConcurrentConsumers" value="${jms.consumerContainer.maxconcurrentconsumers}"/>
        <property name="errorHandler" ref="errorHandler" />
        <property name="connectionFactory" ref="jmsQueueConnectionFactory" />
        <property name="destination" ref="listenerQueue" />
        <property name="messageListener" ref="consumerContainer" />
        <property name="receiveTimeout" value="10000" />
        <property name="sessionTransacted" value="true" />
        <property name="transactionManager" ref="txManager" />
    </bean> 

TX管理器处于休眠状态。

<tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory"/>

并用@Transactional注释具体的类。

我们使用Jboss应用服务器支持通过jndi与MQ集成。 这里的问题是,如果侦听器中的任何层存在任何异常,则不会回滚整个事务,并且消息也不会移回退出队列。显然,当我们使用Hibernate事务管理器时,它并不了解其他资源,例如JMS事务。

我可以用JTA事务安全地替换它吗,因为Jboss将处理整个事务管理?这样做有预见的风险吗?

我相信,如果我们按以下方式使用JTA,则不再需要使用@Transactional对该类进行注释。

<bean id="jtatxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>

谢谢。

解决方法

我可以用JTA交易安全地替换它吗,因为Jboss将负责总体交易管理?

是的,您can。您应该只更改bean txManager的定义。

我相信它不再需要用@Transactional来注释课程。

这不是事实。您仍然需要@Transactional。它允许spring识别事务boundary