假设我们有一个数据库(如Oracle)和一个JMS提供者(如HornetQ),它们参与一个XA事务。消息被发送到JMS队列,并且一些数据在同一分布式事务中持久化到数据库中。事务提交后,消息消费者将读取已持久化的数据并在单独的事务中处理它们。
关于第一个XA事务,在执行时,事务管理器(如JBoss)可能执行以下事件序列:
这个问题可以推广到任何种类的参与XA事务的多个资源,即在提交阶段执行时是否存在小的时间窗口,在此窗口内来自另一个并发事务的读取器可能会获得不一致状态(通过从一个资源读取已提交数据和从另一个资源读取过期数据)?
我认为,事务性资源避免这种情况的唯一方法是在准备阶段完成后封锁所有受影响数据的读取器,直到提交被发出。这样,上述例子中提到的消息消费者将被阻塞,直到数据在数据库中提交。
关于第一个XA事务,在执行时,事务管理器(如JBoss)可能执行以下事件序列:
- 准备 (HornetQ)
- 准备 (Oracle)
- 提交 (HornetQ)
- 提交 (Oracle)
这个问题可以推广到任何种类的参与XA事务的多个资源,即在提交阶段执行时是否存在小的时间窗口,在此窗口内来自另一个并发事务的读取器可能会获得不一致状态(通过从一个资源读取已提交数据和从另一个资源读取过期数据)?
我认为,事务性资源避免这种情况的唯一方法是在准备阶段完成后封锁所有受影响数据的读取器,直到提交被发出。这样,上述例子中提到的消息消费者将被阻塞,直到数据在数据库中提交。