为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

墨色风雨 2022-07-14 09:45:36
我有 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);    }}我尝试了以下方法:我已经配置了两个工作正常的数据源,能够从两个数据库中读取数据搜索后,尝试了 ChainedTransactionManager,通过为两个数据源定义自定义事务管理器名称并在服务之上使用 @Transactional(value="chainedTransactionManager")。仍然没有工作。任何人都可以帮我解决代码的问题吗?为什么只有数据源 2 上的数据没有被持久化?
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

正如 Arjun 建议的那样,您可以将 saveAll 上的事务与适当的事务管理器一起使用。


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


@Configuration

public class ChainedTransactionManagerConfig

{

    /**

     * combined TM

     */

    public static final String TRANSACTION_MANAGER = "chainedTransactionManager";


    /**

     * 

     * @param oneTransactionManager oneTransactionManager

     * @param twoTransactionManager twoTransactionManager

     * @return combined TM

     */

    @Bean(name = TRANSACTION_MANAGER)

    public ChainedTransactionManager transactionManager(

            // Bean name of the first one

            @Qualifier("firstTransactionManager") PlatformTransactionManager oneTransactionManager,

            // Bean name of the second one

            @Qualifier("secondTransactionManager") PlatformTransactionManager twoTransactionManager)

    {

        return new ChainedTransactionManager(oneTransactionManager, twoTransactionManager);

    }

}

然后你可以像这样在你的方法上使用它:


import org.springframework.transaction.annotation.Transactional;


@Transactional(transactionManager = ChainedTransactionManagerConfig.TRANSACTION_MANAGER)

也请使用 Spring 的事务性注解 (org.springframework.transaction.annotation)


查看完整回答
反对 回复 2022-07-14
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

  • 您有 2 个数据源,这意味着您将有 2 个 TransactionManager bean

  • 现在,当您使用 @Transactional 而不指定名称时,它将与默认 TransactionManager 一起使用

  • 这意味着,只有在 processUpdate() 完成后才会提交默认事务

建议

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


查看完整回答
反对 回复 2022-07-14
  • 2 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信