Spring XA事务和消息总线

Spring XA事务和消息总线,spring,transactions,rabbitmq,xa,Spring,Transactions,Rabbitmq,Xa,在我们的新项目中,我们希望实现涉及jpa(mysql)和消息总线(rabbitmq)的事务 我们开始使用mysql和rabbitmq(通过SpringAMQP模块)用spring数据构建基础设施。由于rabbitMq不是XA事务性的,我们将neo4j chainedTransactionManager配置为我们的主事务管理器。此管理器以jpa txManager和rabbitTransactionManager作为参数 现在,我可以用@Transacitol注释服务,并在其中使用jpa和rabb

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

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

现在,我可以用@Transacitol注释服务,并在其中使用jpa和rabbit。如果我在服务中抛出异常,那么实际上没有任何操作发生

以下是我的问题:

  • 这个配置真的给了我一个原子事务吗
  • 我听说链式tx管理器使用的不是两阶段提交,而是“尽力而为”,这种尽力而为是否不太可靠?如果是,怎么做

  • ChainedTransactionManager所做的基本上是以相反的顺序启动和提交事务。因此,如果您有一个
    JpaTransactionManager
    和一个
    RabbitTransactionManager
    ,并将其配置为这样

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new ChainedTransactionManager(rabbitTransactionManager(), jpaTransactionManager());
    }
    
    现在,如果JPA提交成功,但对rabbitMQ的提交失败,那么数据库更改仍将保持不变,因为这些更改已经提交

    为了回答您的第一个问题,它不会给您一个真正的原子事务,在发生
    异常之前提交的所有内容(提交时)都将保持提交状态


    请参阅

    是否可以实现一个事务,其中一个数据源出现故障时,两个数据源都将回滚?否。。。承诺是永久的。解决这个问题的唯一方法是进行补偿事务(即自己跟踪更改并手动回滚)。jta呢?没有锁链的经理,没有兔子。?(例如,使用活动mq?)JTA是一个分布式事务管理器,因此应该可以工作,但是否需要额外的开销?您预计出错的频率有多高,例如,you可以先提交数据库,当提交/发送消息出错时,尝试(稍后)重新发送消息(反之亦然)。事务与概率无关。它们是关于正确性的。拥有逻辑损坏的数据通常不是一种选择。因此,如果需要更新多个数据源,则需要使用XA或分布式事务。