Spring XA事务和消息总线
在我们的新项目中,我们希望实现涉及jpa(mysql)和消息总线(rabbitmq)的事务 我们开始使用mysql和rabbitmq(通过SpringAMQP模块)用spring数据构建基础设施。由于rabbitMq不是XA事务性的,我们将neo4j chainedTransactionManager配置为我们的主事务管理器。此管理器以jpa txManager和rabbitTransactionManager作为参数 现在,我可以用@Transacitol注释服务,并在其中使用jpa和rabbit。如果我在服务中抛出异常,那么实际上没有任何操作发生 以下是我的问题: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
ChainedTransactionManager所做的基本上是以相反的顺序启动和提交事务。因此,如果您有一个
JpaTransactionManager
和一个RabbitTransactionManager
,并将其配置为这样
@Bean
public PlatformTransactionManager transactionManager() {
return new ChainedTransactionManager(rabbitTransactionManager(), jpaTransactionManager());
}
现在,如果JPA提交成功,但对rabbitMQ的提交失败,那么数据库更改仍将保持不变,因为这些更改已经提交
为了回答您的第一个问题,它不会给您一个真正的原子事务,在发生异常之前提交的所有内容(提交时)都将保持提交状态
请参阅是否可以实现一个事务,其中一个数据源出现故障时,两个数据源都将回滚?否。。。承诺是永久的。解决这个问题的唯一方法是进行补偿事务(即自己跟踪更改并手动回滚)。jta呢?没有锁链的经理,没有兔子。?(例如,使用活动mq?)JTA是一个分布式事务管理器,因此应该可以工作,但是否需要额外的开销?您预计出错的频率有多高,例如,you可以先提交数据库,当提交/发送消息出错时,尝试(稍后)重新发送消息(反之亦然)。事务与概率无关。它们是关于正确性的。拥有逻辑损坏的数据通常不是一种选择。因此,如果需要更新多个数据源,则需要使用XA或分布式事务。