-->

XA / JTA事务:JMS消息到来之前,DB变化是显而易见的(XA/JTA transaction

2019-08-08 19:38发布

背景是:

  • 生产者(JTA事务PT)是既发送消息给JMS队列,使DB更新;
  • 消费者(JTA事务CT)侦听同一队列和接收消息时,读取DB;
  • 应用服务器 - WebLogic中,DB - 甲骨文。

我观察到,有时CT是不(没?)能看到PT的DB变化,事件如果相应的JMS消息是已经收到(PT承诺?)。

看来,JTA不能保证此类(这也证实了于尔根·霍勒的演讲“交易方式选择的性能”)的一致性。

什么是避免这种问题(除了显而易见的 - 不使用JTA)的最好方法?

谢谢。

Answer 1:

因此,似乎有这个问题并没有简单,优雅和防故障的解决方案。 在我们的情况下,决定依靠简单的再分发机制(引发异常,并让JMS消息一定时间后进行重发)。

同时考虑:

  • 标记DB数据源作为和期待上一个资源提交优化(LRCO)踢入(因此XA事务中提交的部分控制顺序)。 被拒绝,由于依赖于应用服务器(WL)的内部。

  • 设置DeliveryDelay到JMS消息,所以它只能一段时间后食用,当(据说)DB同步结束。 拒绝由于缺乏担保而需要微调它针对不同的环境。

博客文章在其他答复中提到的确包含了涵盖所有这些和其他几个选项(但没有明确的一个)。



Answer 2:

一些选项罗列如下: http://jbossts.blogspot.co.uk/2011/04/messagingdatabase-race-conditions.html



Answer 3:

关于答案:

“因此,似乎有这个问题并没有简单,优雅和防故障的解决方案。在我们的情况下,决定依靠简单的再分发机制(引发异常,并让JMS消息一定时间后进行重发)”。

如果启动Transaction1将逻辑结束后,你的第二个交易具有检测,该交易1的变化还不明显的方式,这是唯一的失败证明,并炸毁本身techichal例外。

当你有交易2比1交易不同的进程那么这很可能是能够检查。 最有可能的交易1的输出是必要的交易2成功前进。 你只能做的薯条,如果你有土豆......如果你没有土豆可以吹起来,下次再试一次。

但是,如果你的过程,是打破由于DB出现陈旧的是,在交易1本身运行完全相同的过程。 刚刚添加的土豆扔进了肠(如数据库表),并不能检测到您肠管overlfowing并继续运行的事务pumptit起来......这样的检查可能是出于你的手。

那种东西,正好是我的情况。

这方面的一个理论的解决方案很可能是试图通过创建一个人造实体相当于JPA的@Version场,迫使每个需要连续运行在一个共同的实体锤的更新过程诱导脏读的数据库。 如果两个交易2和1个更新一个共同的实体的普通领域,过程中会有突破 - 无论你在第二交易获得JPA乐观锁定异常,或者如果你从一个数据库中的脏读更新例外。

我没有测试过这种方法还,但它很可能将是各地需要工作,遗憾的是足够的。



文章来源: XA/JTA transaction: JMS message arrives before DB changes are visible