如何解决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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。