2017-08-04 8 views
1

トランザクションをサポートするさまざまなデータベースと話をし、春に提供される注釈を使用してそれをやりたいユースケースがあります。@異なるデータソースを使ったトランザクションアノテーション

このアノテーションが表示される仕組みは、クライアントによって定義されたDataSource Beanを持つPlatformTransactionManagerのデフォルトの実装を選択し、その永続性レイヤーと通信することです。

他のデータソースと話すには、新しいデータソースの助けを借りてdoBeginメソッドをオーバーライドするTransactionManagerメソッドを提供する必要があります。

しかし、ここで問題になるのは、@Transaction注釈で選択するデータソースを知る方法がないことです(私には表示されないため、これらのケースでどのようにブートストラップが機能するかはわかりません)。途中の豆の紛争が起きる可能性があります - 多分私はここで何かを逃しています)

代替案は、デフォルトのデータソースのパラメータを受け入れる新しいアノテーション@DataSourceAwareTransactionを作成し、ロジックが新しいアノテーションに書き込まれると考えることができます。

このアプローチの問題は、@Transactionから@DataSourceAwareTransactionに移行するために既存のコードをすべて変更する必要があることです。

私が記述しているアプローチは十分に見えますか?誰か良いアイデアはありますか?

ありがとうございます!

答えて

1

しかし、ここで問題は、私はそれを行う場合には、そのデータソースを選択することについて@Transaction注釈を知る方法はありませんということです....

確かにあります。 @Transactional#transactionManagerをご覧ください。関連セクションの状態:

のTransactionManagerは別名である)
特定PlatformTransactionManagerビーン定義の修飾子値(またはBean名)と一致する、ターゲットトランザクションマネージャを決定するために使用され得ます。

@Transactionalを使用するトランザクションマネージャを指定できます。トランザクションマネージャは、特定のデータソース用に構成されています。

例:トランザクションマネージャのBean定義は次のようなものになります

@Transactional("yourTransactionManager") 

または

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

@Bean 
public PlatformTransactionManager yourTxManager() { 
    return new JpaTransactionManager(entityManagerFactory().getObject()); 
} 
関連する問題