XA事务中的数据一致性

Dra*_*vic 22 java oracle jboss xa hornetq

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

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

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

如果消息使用者在HornetQ中完成提交后开始读取数据,但仍在Oracle中执行,会发生什么?消息使用者是否会读取陈旧数据?

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

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

Jus*_*tin 7

不幸的是,XA事务不支持一致性.当映射到CAP定理时, XA解决了跨多个数据存储的可用性和分区容错.这样做必须牺牲一致性.使用XA时,您必须拥抱最终的一致性.

无论如何,创建CP或AP的系统都很难,无论您的数据存储或事务模型如何,您都将面临此问题.