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

标签 java oracle jboss hornetq xa

假设我们有一个数据库(例如 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/

相关文章:

sql - Oracle SQL唯一约束A到B,B到A

java - Oracle 序列事务性

java - Apache Jackrabbit 2.10.1.rar 版本未在 Wildfly 9.0.1 中部署

java - Redisson(通过 JCache API)仅反序列化为 String

Java, HashMap 中的 HashMap

java - JSF 中的多个页面不调用支持 bean 更改器(mutator)

java - Jboss Java EE 容器和一个 ExecutorService

java - 更改Swagger codegen中生成的支持文件的包

连接Oracle数据库时遇到java.sql.SQLException

java - 如何在EAR项目中部署EJB项目和JPA项目