2017-08-04 56 views
1

我們有一個用例,我們希望與支持交易的不同數據庫交談,並希望通過Spring提供的註釋來完成交易。@不同數據源的交易註釋

我看到此註釋的工作方式是使用由客戶機定義的DataSource bean選擇PlatformTransactionManager的默認實現,並與該持久層進行通信。

因此,要與另一個數據源交談,我將不得不提供一個TransactionManager,它在新數據源的幫助下覆蓋其doBegin方法。

但是,這裏的問題是,如果我這樣做,那麼@Transaction註釋就無法知道要選擇哪個數據源(我無法看到引導程序在這些情況下如何工作,因爲我沒有看到一種豆類衝突可能出現的方式 - 也許我在這裏失去了一些東西)。

我能想到的一種替代方法是創建一個新的註解@DataSourceAwareTransaction,它接受默認數據源的參數,並將邏輯寫入新註解中。

這種方法的問題是,我將不得不將所有現有代碼從@Transaction更改爲@DataSourceAwareTransaction。

我描述的方法看起來合理嗎?有沒有人有更好的想法?

謝謝!

回答

1

但這裏的問題是,如果我這樣做,是沒有辦法的@Transaction註釋知道挑選哪個數據源....

肯定有。看看@Transactional#transactionManager。的相關部分規定:

transactionManager的是別名)
可以是用於確定目標事務管理器,匹配特定PlatformTransactionManager bean定義的限定符值(或豆名稱)。

您可以指定要使用@Transactional的事務管理器,然後事務管理器會針對特定數據源進行配置。

例子:

@Transactional("yourTransactionManager") 

@Transactional(value = "yourTxManager", isolation = ..., propagation = ...) 

如果你的事務管理器bean定義看起來是這樣的:

@Bean 
public PlatformTransactionManager yourTxManager() { 
    return new JpaTransactionManager(entityManagerFactory().getObject()); 
}