【问题标题】:XA transactions and message busXA 事务和消息总线
【发布时间】:2013-12-12 10:18:46
【问题描述】:

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

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

现在,我确实能够使用 @Transacitonal 注释服务并在其中使用 jpa 和 rabbit。如果我在服务中抛出异常,则实际上不会发生任何操作。

这是我的问题:

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

【问题讨论】:

    标签: spring transactions rabbitmq xa


    【解决方案1】:

    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

    【讨论】:

    • 是否可以实现单个事务,两个数据源在其中一个失败时回滚?
    • 否... 提交是永久性的。解决此问题的唯一方法是进行补偿事务(即自己跟踪更改并手动回滚)。
    • jta 呢?没有链式经理,也没有兔子。? (即用活动 mq 代替?)
    • JTA 是一个分布式事务管理器,因此应该可以工作,但是需要额外的开销吗?您预计多久会出错一次,例如,您可以先提交数据库,当提交/发送消息出错时,尝试重新发送(稍后)消息(反之亦然)。
    • 交易与概率无关。它们是关于正确性的。拥有逻辑损坏的数据通常不是一种选择。所以如果需要更新多个数据源,就需要使用XA或者分布式事务。
    猜你喜欢
    • 2012-06-21
    • 2020-01-04
    • 1970-01-01
    • 2010-11-02
    • 2012-08-22
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多