spring - XA 事务和消息总线

标签 spring transactions rabbitmq xa

在我们的新项目中,我们希望实现涉及 jpa (mysql) 和消息总线 (rabbitmq) 的事务
我们开始使用 mysql 和 rabbitmq(通过 spring amqp 模块)使用 spring 数据构建我们的基础设施。由于 rabbitMq 不是 XA-transactional,我们将 neo4j chainedTransactionManager 配置为我们的主要 transactionManager。该管理器将 jpa txManager 和 rabbitTransactionManager 作为参数。
现在,我确实能够使用 @Transacitonal 注释服务并在其中使用 jpa 和 rabbit。如果我在服务中引发异常,则实际上不会发生任何操作。
以下是我的问题:

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

    什么ChainedTransactionManager基本上是以相反的顺序启动和提交事务。因此,如果您有 JpaTransactionManagerRabbitTransactionManager并像这样配置它。

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

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

    要回答您的第一个问题,它不会给您一个真正的原子事务,即在 Exception 发生之前已提交的所有内容。 (提交时)将保持 promise 。

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

    关于spring - XA 事务和消息总线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20540710/

    相关文章:

    java - SQL语句MyBatis中未知元素<select>

    java - POM打包option jar to war改错

    java - Spring:为什么普通 Controller 和@ResponseBody Controller 生成不同的代码?

    rabbitmq - 可以在互联网上公开 Rabbitmq 吗?

    grails - 如何在应用程序启动后启动 RabbitMQ 监听器?

    java - 当消息可用时,JMS receiveNoWait() 是否保证消息传递?

    java - 在 hibernate 中将单个 bean 类映射到多个表

    php - MySQL 事务 - 在队列中处理拍卖投标插入?

    php - Mysql:如何在事务期间锁定整个表?

    javascript - TCP NODE JS 多线程问题