gpt4 book ai didi

java - XA 事务中的数据一致性

转载 作者:IT老高 更新时间:2023-10-28 20:42:16 27 4
gpt4 key购买 nike

假设我们有一个数据库(例如 Oracle)和一个 JMS 提供者(例如 HornetQ)参与 XA 事务。一条消息被发送到一个 JMS 队列,并且一些数据在同一个分布式事务中保存在数据库中。事务提交后,消息消费者将读取持久化的数据并在单独的事务中处理它们。

关于第一个 XA 事务,事务管理器(例如 JBoss)可能会执行以下事件序列

  1. 准备(HornetQ)
  2. 准备 (Oracle)
  3. 提交 (HornetQ)
  4. 提交 (Oracle)

如果消息消费者在 HornetQ 中提交完成后开始读取数据,但仍在 Oracle 中执行,会发生什么?消息消费者会读取过期数据吗?

这个问题可以推广到参与 XA 事务的任何类型的多个资源,即是否有可能存在一个小时间窗口(执行提交阶段时),其中来自另一个并发事务的读取器可能会获得不一致的状态(通过从一种资源中读取已提交的数据并从另一种资源中读取陈旧数据)?

我想说,事务资源防止这种情况的唯一方法是在准备阶段完成后阻止所有受影响数据的读取器,直到发出提交。这样,上面提到的示例消息使用者将阻塞,直到数据提交到数据库中。

最佳答案

很遗憾,XA 事务不支持一致性。映射到 CAP theorem 时XA 解决了跨多个数据存储的可用性和分区容错问题。在这样做时,它必须牺牲一致性。使用 XA 时,您必须接受最终一致性。

无论如何,创建 CP 或 AP 系统是 hard enough无论您的数据存储或事务模型如何,您都将面临这个问题。

关于java - XA 事务中的数据一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709869/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com