4

我有一个奇怪的现象,似乎在数据库提交实际发生之前就发送了 jms 消息。

假设我有一个服务器操作 foo() ,它在完成时向客户端发送一条消息。客户端然后从服务器加载更改的数据。现在看来 jms 消息是在提交实际完成之前发送的,因此客户端仍然获取旧数据,因为它的请求仍然在原始提交结束之前。

整个服务器操作肯定是事务性的,因为如果抛出异常,则不会发送 jms 事件。

jms 规范中是否有任何要求首先必须发生所有数据库提交,然后发送 jms 消息,或者这取决于实现的顺序?

我们正在讨论 jboss 6.0.0.Final 中默认的 hornetq 实现。

更新:

看来我和这些人有同样的问题:http: //techstack.com/forum/websphere/34434-order-commits-xa-transaction.html

更新 2:

另一个有同样问题的用户http://community.jboss.org/message/114459

4

2 回答 2

1

您只需要确保您的连接工厂是同一个 XA 事务的一部分。

正如 Gursel Koca 在另一篇文章中所说,您必须在 EJB 上设置 REQUIRES_NEW 。

更简单的是您使用 JCA 连接工厂(通常位于 java://JmsXA)

于 2011-06-28T17:58:41.170 回答
0

JMS 操作是事务性的,这就是 jms 消息在提交时传递的原因。如果您想查看已提交的数据,请将数据库操作放入另一个具有事务属性的 EJB 方法REQUIRES_NEW

于 2011-06-10T12:55:30.673 回答