上下文是:
- 生产者(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/