假设我们有一个参与XA事务的数据库(例如Oracle)和JMS提供者(例如HornetQ)。一条消息被发送到一个JMS队列,并且一些数据在同一个分布式事务中被保存在数据库中。事务提交后,消息使用者将读取持久数据并在单独的事务中处理它们。XA事务中的数据一致性
关于第一XA事务,下面的事件序列可以由事务管理器(如,JBoss)
- 制备(HornetQ的)
- 制备(Oracle)的
- 提交(HornetQ的)执行的
- 提交(甲骨文)
如果消息消费者开始读取数据提交后会发生什么在HornetQ完成,但仍在Oracle中执行?消息使用者是否会读取陈旧的数据?
这个问题可以推广到任何种类的参与XA事务的多种资源,也就是说,在另一个并发事务的读者可以获得不一致状态的小时间窗口(执行提交阶段时) (通过读取来自一个资源的提交数据和来自另一个资源的陈旧数据)?
我想说,事务性资源阻止这种情况的唯一方法是在准备阶段完成之前阻止受影响数据的所有读者,直到发出提交。这样上面提到的示例消息使用者将阻塞,直到数据在数据库中提交。
这是一个很好的问题,这是JTA IMO的主要问题,即使规范太过轻描述(因为它应该)这样一个复杂的机制,它也没有适当的记录。 –
此外,这不是更糟糕的用例,请考虑当XAResource实现者无法恢复时您提交失败的情况。 –
详细规范太久无法回答,但可以在Oracle白皮书中找到[“XA和Oracle受控分布式交易”](http://www.oracle.com/technetwork/products/clustering/overview/distributed -transactions-and-xa-163941.pdf)的第12页“分布式事务和数据库锁定”一章。 – ThinkJet