XA事务和消息总线

时间:2013-12-12 10:18:46

标签: spring transactions rabbitmq xa

在我们的新项目中,我们希望实现涉及jpa(mysql)和消息总线(rabbitmq)的事务

我们开始使用mysql和rabbitmq(通过spring amqp模块)使用spring数据构建我们的基础结构。由于rabbitMq不是XA事务,我们将neo4j chainedTransactionManager配置为我们的主事务管理器。该管理器将jpa txManager和rabbitTransactionManager作为参数。

现在,我确实能够使用@Transacitonal注释服务并在其中使用jpa和rabbit。如果我在其中抛出异常而非实际发生的动作。

以下是我的问题:

  1. 这个配置真的给我一个原子事务吗?
  2. 我听说过被控制的tx管理器没有使用2阶段提交而是“尽力而为”,这种最好的努力是不太可靠的?如果是这样的话?

1 个答案:

答案 0 :(得分:3)

ChainedTransactionManager的作用基本上是以相反的顺序启动和提交事务。因此,如果你有一个JpaTransactionManager和一个RabbitTransactionManager,并按照这样配置。

@Bean
public PlatformTransactionManager transactionManager() {
    return new ChainedTransactionManager(rabbitTransactionManager(), jpaTransactionManager());
}

现在,如果JPA提交成功但您对rabbitMQ的提交失败,您的数据库更改仍将保留,因为这些更改已提交。

要回答你的第一个问题,它并没有给你一个真正的原子事务,在Exception(提交时)出现之前已经提交的所有内容都将继续提交。

请参阅http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/transaction/ChainedTransactionManager.html