java - XA/JTA 事务 : JMS message arrives before DB changes are visible

标签 java jms jta distributed-transactions xa

上下文是:

  • 生产者(JTA 事务PT)正在向 JMS 队列发送消息并进行数据库更新;
  • consumer (JTA transaction CT) 在同一个队列上监听并在收到消息时读取 DB;
  • 应用服务器 - WebLogic,数据库 - Oracle。

我观察到,有时 CT(还?)无法看到 PT 的数据库更改,如果已收到相应的 JMS 消息(PT promise 了吗?)。

似乎 JTA 不能保证这种一致性(这在 Jurgen Holler 的演讲 “Transaction Choices for Performance” 中也得到了证实)。

避免此类问题的最佳方法是什么(明显的除外 - 不使用 JTA)?

谢谢。

最佳答案

因此似乎没有简单、优雅且万无一失的解决方案。在我们的案例中,决定依赖简单的重新传递机制(抛出异常并让 JMS 消息在一定时间后重新传递)。

还考虑了:

  • 将 DB 数据源标记为并期待上次资源提交优化 (LRCO) 启动(从而部分控制 XA 事务内的提交顺序)。由于依赖于应用程序服务器 (WL) 的内部结构而被拒绝。

  • 将 DeliveryDelay 设置为 JMS 消息,因此它只能在一段时间后使用,当(假设)数据库同步结束时。由于缺乏保证而被拒绝,需要针对不同的环境进行微调。

Blog post其他答案中提到的确实包含所有这些以及涵盖的其他几个选项(但没有确定的选项)。

关于java - XA/JTA 事务 : JMS message arrives before DB changes are visible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14595118/

相关文章:

java - jquery 数组文本框旁边的消息

java - 从 Redis 集合中检索数据

java - 一旦客户端确认,JMS 主题上的消息是否可用?

spring - 在 Web 应用程序中使用 spring 的 jta

hibernate - 如何在 JBoss AS 6、Hibernate 3.6、JPA、JTA 和 EJB3 中使用容器管理事务 (CMT)

java - 解压 tar.gz 后,文件权限不会被保留

java - 将字符串转换为 Set<String>

java - JMS/HornetQ = 如何从客户端以编程方式创建 JMS 队列?

jms - 是否有任何可移植 TIBCO EMS 可用于测试?

java - infinispan 与实例级别的 Jta