@Transactional saveAll 不适用于第二个数据源 Spring JPA 中的表

我有 2 个数据源,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);

    }

}

我尝试了以下方法:

  1. 我已经配置了两个工作正常的数据源,能够从两个数据库中读取数据

  2. 搜索后,尝试了 ChainedTransactionManager,通过为两个数据源定义自定义事务管理器名称并在服务之上使用 @Transactional(value="chainedTransactionManager")。仍然没有工作。

任何人都可以帮我解决代码的问题吗?为什么只有数据源 2 上的数据没有被持久化?


墨色风雨
浏览 94回答 2
2回答

蝴蝶不菲

正如 Arjun 建议的那样,您可以将 saveAll 上的事务与适当的事务管理器一起使用。或者您可以像这样定义一个分布式事务管理器(假设您有两个事务管理器的 bean):@Configurationpublic class ChainedTransactionManagerConfig{&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* combined TM&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public static final String TRANSACTION_MANAGER = "chainedTransactionManager";&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;*&nbsp;&nbsp; &nbsp; &nbsp;* @param oneTransactionManager oneTransactionManager&nbsp; &nbsp; &nbsp;* @param twoTransactionManager twoTransactionManager&nbsp; &nbsp; &nbsp;* @return combined TM&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; @Bean(name = TRANSACTION_MANAGER)&nbsp; &nbsp; public ChainedTransactionManager transactionManager(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Bean name of the first one&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Qualifier("firstTransactionManager") PlatformTransactionManager oneTransactionManager,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Bean name of the second one&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Qualifier("secondTransactionManager") PlatformTransactionManager twoTransactionManager)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return new ChainedTransactionManager(oneTransactionManager, twoTransactionManager);&nbsp; &nbsp; }}然后你可以像这样在你的方法上使用它:import org.springframework.transaction.annotation.Transactional;@Transactional(transactionManager = ChainedTransactionManagerConfig.TRANSACTION_MANAGER)也请使用 Spring 的事务性注解 (org.springframework.transaction.annotation)

慕的地8271018

您有 2 个数据源,这意味着您将有 2 个 TransactionManager bean现在,当您使用 @Transactional 而不指定名称时,它将与默认 TransactionManager 一起使用这意味着,只有在 processUpdate() 完成后才会提交默认事务建议我不知道您是否有分布式事务管理的要求,如果没有,那么只需在 saveAll() 上使用具有适当 TransactionManager 名称的独立 @Transactional
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java