7

2 つの別々の spring xml ファイルで定義された 2 つのトランザクション マネージャーがあり、それらの両方が spring コンテキストに読み込まれます。

ファイルワン

   <tx:annotation-driven transaction-manager="transactionManager1"/>

  <bean id="transactionManager1"
       class="org.springframework.jdbc.DataSourceTransactionManager">
    ...
  </bean>

ファイル 2

 <tx:annotation-driven transaction-manager="transactionManager2"/>
  <bean id="transactionManager2"
          class="org.springframework.jdbc.DataSourceTransactionManager">
    ...
  </bean> 

以下のサービスの修飾子を指定しなかった場合、どのトランザクション マネージャー スプリングが使用するか。

public class TransactionalService {

    @Transactional
    public void setSomething(String name) { ... }

    @Transactional
    public void doSomething() { ... }
}
4

1 に答える 1

17

公式ドキュメントから11.5.6の@Transactionalの使用を確認してください。

ワイヤリングするのBean名の名前が。である場合はtransaction-manager、タグの属性を省略できます。依存性注入するBeanに他の名前がある場合は、属性を明示的に使用する必要があります[...]<tx:annotation-driven/>PlatformTransactionManagertransactionManagerPlatformTransactionManagertransaction-manager

トランザクションマネージャーには名前が付けられtransactionManagerていないため、でマークされたメソッドに使用するトランザクションマネージャーを指定する必要があります@Transactional


更新:変更された質問に対処します。注釈に使用するトランザクションマネージャーを指定できます@Transactional(以下を参照@Transactional.value())。

@Transactional("transactionManager1")
//...

@Transactional("transactionManager2")
//...

ただし、現在の設定にはいくつかの問題があります。

  • <tx:annotation-driven/>異なるトランザクションマネージャで2回定義します。そのような構成は有効ではないと思います

  • トランザクションマネージャーを明示的に提供せずに、どちらを使用する必要がありますか?

私がうまくいくと思う解決策は、<tx:annotation-driven transaction-manager="transactionManager1"/>一度定義し@Transactionalて、最初のマネージャー@Transactional("transactionManager2")を使用し、2番目のマネージャーを使用することです。またはその逆。

于 2012-09-26T16:39:49.493 に答える