Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Neo4j+;Postgres公共事务_Java_Spring_Postgresql_Neo4j_Transactions - Fatal编程技术网

Java Neo4j+;Postgres公共事务

Java Neo4j+;Postgres公共事务,java,spring,postgresql,neo4j,transactions,Java,Spring,Postgresql,Neo4j,Transactions,我有一个Spring应用程序,它使用Neo4j图形数据库和Postgresql关系数据库。两个数据库都支持事务 我可以使用具有适当transactionManager属性的Spring@Transactional注释在每个数据库上分别处理事务 然而,我有很多方法同时在neo4j db和postgres db上处理数据。这样的操作应该是事务性的,所以我想“合并”这些单独的事务。我的意思是,如果smth在一个数据库引擎上失败,那么另一个数据库引擎也应该回滚自己的事务 是否有任何库或工具可以帮助我实现

我有一个Spring应用程序,它使用Neo4j图形数据库和Postgresql关系数据库。两个数据库都支持事务

我可以使用具有适当transactionManager属性的Spring@Transactional注释在每个数据库上分别处理事务

然而,我有很多方法同时在neo4j db和postgres db上处理数据。这样的操作应该是事务性的,所以我想“合并”这些单独的事务。我的意思是,如果smth在一个数据库引擎上失败,那么另一个数据库引擎也应该回滚自己的事务

是否有任何库或工具可以帮助我实现这一目标?还是我必须自己实施


提前谢谢

您可以像下面一样使用
ChainedTransactionManager

<bean id="transactionManager" class="com.springsource.open.db.ChainedTransactionManager">
  <property name="transactionManagers">
    <list>
      <!-- Postgresql Transaction Manager -->
      <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"/>
      <!-- Neo4J Transaction Manager -->
      <bean class="org.neo4j.ogm.session.transaction.TransactionManager"/>    
    </list>
  </property>
</bean>


您不想自己实现这一点。该协议称为2PC(两阶段提交)。Postgresql支持它;Neo4j似乎也支持它。您只需要一些东西来协调两者之间的事务。Spring帮助您实现事务管理器这篇文章解释了如何使用Spring JtaTransactionManager:正如我从ChainedTransactionManager的描述中理解的,它没有实现2PC。在这种情况下,可以将事务提交到Postgresql,并回滚到Neo4J。这基本上是多资源事务的幼稚实现。它只是通过提供的TransactionManager循环处理事务。因此,无法保证在两个db引擎上都会进行提交。这不是正确的解决方案,但总比没有好。正如@Cristian Sevescu所说的,我们要做的是JtaTransactionManager。以下是如何在SpringBoot中使用它的一些信息: