Java @事务性saveAll不适用于第二数据源Spring JPA中的表

Java @事务性saveAll不适用于第二数据源Spring JPA中的表,java,hibernate,spring-data-jpa,spring-data,Java,Hibernate,Spring Data Jpa,Spring Data,我有两个数据源,ds1,ds2。在一个@Transactional的服务中,我必须从两个表中获取值并更新它们 示例代码段 @Service public class MyService { @Autowired ds1Repository ds1Repository; // from data source 1 (DB Name - DB1) MYSQL @Autowired ds2Repository ds2Repository; // from

我有两个数据源,ds1,ds2。在一个@Transactional的服务中,我必须从两个表中获取值并更新它们

示例代码段

    @Service
    public class MyService {
    @Autowired
    ds1Repository ds1Repository; // from data source 1 (DB Name - DB1) MYSQL
    @Autowired
    ds2Repository ds2Repository; // from data source 2 (DB Name - DB2) MYSQL

    @Transactional (javax.Transactional)
    public void processUpdates() {
        // Able to get the result set from both the data sources
        List<Data1> ds1Data = ds1Repository.findAll();
        List<Data2> ds2Data = ds1Repository.findAll();

        // modified the collections ds1Data & ds2Data

        // This is getting updated
        ds1Repository.saveAll(ds1Data);

        // This update is not heppening and no exception thrown
        ds2Repository.saveAll(ds2Data);
    }
}
@服务
公共类MyService{
@自动连线
ds1Repository ds1Repository;//来自数据源1(DB Name-DB1)MYSQL
@自动连线
ds2Repository ds2Repository;//来自数据源2(DB Name-DB2)MYSQL
@事务性(javax.Transactional)
public void processUpdates(){
//能够从两个数据源获取结果集
List ds1Data=ds1Repository.findAll();
List ds2Data=ds1Repository.findAll();
//修改了集合ds1Data和ds2Data
//这是得到更新
ds1Repository.saveAll(ds1Data);
//此更新未打开且未引发异常
ds2Repository.saveAll(ds2Data);
}
}
我尝试了以下WY:

  • 我已经配置了两个工作正常的数据源,能够从两个数据库读取数据
  • 搜索后,通过为两个数据源定义自定义事务管理器名称并在服务顶部使用@Transactional(value=“ChainedTransactionManager”),尝试使用ChainedTransactionManager。还是不行
  • 有人能帮我一下密码到底是怎么回事吗?为什么仅数据源2上的数据未得到持久化?

    • 您有2个数据源,这意味着您将有2个 TransactionManager bean
    • 现在,当您使用@Transactional而不指定名称时,它将 使用默认TransactionManager
    • 这意味着,只有默认事务提交一次 processUpdate()完成
    暗示

    • 我不知道您是否需要分布式事务管理,如果没有,那么就使用带有适当TransactionManager名称的独立@Transactional on saveAll()

    正如Arjun所建议的那样,您可以使用saveAll上的事务管理器和适当的事务管理器

    或者您可以这样定义分布式事务管理器(假设两个事务管理器都有bean):

    然后您可以在您的方法中使用它,如下所示:

    import org.springframework.transaction.annotation.Transactional;
    
    @Transactional(transactionManager = ChainedTransactionManagerConfig.TRANSACTION_MANAGER)
    

    另外,请使用Spring中的事务性注释(org.springframework.transaction.Annotation)

    您可以将您的尝试粘贴到
    ChainedTransactionManager
    公共类多数据源transactionManager{@Bean(name=“ChainedTransactionManager”)公共ChainedTransactionManager transactionManager(@Qualifier(“transactionManager”)PlatformTransactionManager ds1,@Qualifier(“tm2”)PlatformTransactionManager ds2{返回新的ChainedTransactionManager(ds1,ds2);}}
    import org.springframework.transaction.annotation.Transactional;
    
    @Transactional(transactionManager = ChainedTransactionManagerConfig.TRANSACTION_MANAGER)