在我们的新项目中,我们希望实现涉及jpa(mysql)和消息总线(rabbitmq)的事务
我们开始使用mysql和rabbitmq(通过spring amqp模块)使用spring数据构建我们的基础结构。由于rabbitMq不是XA事务,我们将neo4j chainedTransactionManager配置为我们的主事务管理器。该管理器将jpa txManager和rabbitTransactionManager作为参数。
现在,我确实能够使用@Transacitonal注释服务并在其中使用jpa和rabbit。如果我在其中抛出异常而非实际发生的动作。
以下是我的问题:
答案 0 :(得分:3)
ChainedTransactionManager
的作用基本上是以相反的顺序启动和提交事务。因此,如果你有一个JpaTransactionManager
和一个RabbitTransactionManager
,并按照这样配置。
@Bean
public PlatformTransactionManager transactionManager() {
return new ChainedTransactionManager(rabbitTransactionManager(), jpaTransactionManager());
}
现在,如果JPA提交成功但您对rabbitMQ的提交失败,您的数据库更改仍将保留,因为这些更改已提交。
要回答你的第一个问题,它并没有给你一个真正的原子事务,在Exception
(提交时)出现之前已经提交的所有内容都将继续提交。