亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

@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 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號