Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 Spring Boot:具有两个DB的事务,如果第二个DB失败,则回滚第一个DB_Java_Spring_Datasource_Jdbctemplate_Transactional - Fatal编程技术网

Java Spring Boot:具有两个DB的事务,如果第二个DB失败,则回滚第一个DB

Java Spring Boot:具有两个DB的事务,如果第二个DB失败,则回滚第一个DB,java,spring,datasource,jdbctemplate,transactional,Java,Spring,Datasource,Jdbctemplate,Transactional,我正在构建一个具有两个数据源的Spring引导应用程序。我需要在DB1中进行更新,然后在DB2中进行更新。但如果DB2的更新失败,DB1更新应该回滚 我也看到过同样的问题,但是ChainedTransactionManager实现对我不起作用 我目前的做法是: 我为事务管理器提供了两个具有不同数据源的bean: 我有两种事务性方法来进行更新。出于某种奇怪的原因,@Transactional注释在任何方法中都不起作用。但到目前为止,这两种方法在其数据源中运行良好 对于第一个DB: @凌驾 公共布尔

我正在构建一个具有两个数据源的Spring引导应用程序。我需要在DB1中进行更新,然后在DB2中进行更新。但如果DB2的更新失败,DB1更新应该回滚

我也看到过同样的问题,但是ChainedTransactionManager实现对我不起作用

我目前的做法是:

我为事务管理器提供了两个具有不同数据源的bean:

我有两种事务性方法来进行更新。出于某种奇怪的原因,@Transactional注释在任何方法中都不起作用。但到目前为止,这两种方法在其数据源中运行良好

对于第一个DB:

@凌驾 公共布尔更新B1{ transactionTemplate.setTransactionManagerdataSourceTransactionManagerSP; 返回transactionTemplate.executestatus->{ 布尔值r1=repository1.update1; 布尔r2=repository1.update2; 返回r1和r2; }; } 对于第二个DB:

@凌驾 公共布尔更新B2{ transactionTemplate.setTransactionManagerdataSourceTransactionManagerBOL; 返回transactionTemplate.executestatus->{ 布尔值r1=repository2.update1; 布尔值r2=repository2.update2; 返回r1和r2; }; } 但现在我需要一个调用updateDB1和updateDB2的方法,如果DB2失败,DB1将回滚

@凌驾 公共布尔更新框{ 返回transactionTemplate.executestatus->{ 布尔r1=更新的b1; 布尔r2=更新的b2; 返回r1和r2; }; }
我知道这不起作用,因为我需要指定TransactionManager,但这就是问题所在,我有两个事务管理器。

我认为您应该使用相同的方法updateBoth来控制回滚DB1。在spring Doc中,您可以找到以下示例:

transactionTemplate.execute(new TransactionCallbackWithoutResult() {

  protected void doInTransactionWithoutResult(TransactionStatus status) {
    try {
      updateOperation1();this is your updateDB1()
      updateOperation2();-->this is your updateDB2()
    } catch (SomeBusinessExeption ex) {
      status.setRollbackOnly();
    }
  }
});

我会让updateDB2启动一些自定义异常,这些异常可能会在捕获中被捕获,然后使状态回滚。在本例中,假设您希望手动回滚的是DB1,那么要使用的事务管理器是DataSourceTransactionManager SP DB1。您可以使用@TransactionaldataSourceTransactionManagerBOL控制DB2的事务,谢谢!你能分享一下你发现这个的Spring文档吗?当然,给你:你的答案帮助我找到了解决方案:。最后,我创建了一个仅适用于DB1的新事务模板,创建了该事务,并在其中创建了另一个适用于DB2的事务模板。如果DB2失败,我抛出第一个transactionTemplate捕获的异常,回滚工作。谢谢!