4

@Transactionnal を Spring で使用する場合

  • トランザクションを開くデータソースをどのように選択しますか?

  • プロキシ、スレッドローカルなどの魔法のトリックはありますか?

  • もしそうなら、これらのトリックはどの JDBC ライブラリでも機能しますか (Hibernate では機能しますが、MyBatis ではどうでしょうか?)

  • 2 つのデータソースがある場合はどうなりますか?

  • @Transactionnal サービスで、2 つの異なるデータソースを持つ DAO を呼び出すとどうなりますか? 両方のデータソースに対してトランザクション対応になるのでしょうか、それともどちらか一方だけに対してトランザクションになるのでしょうか? それとも失敗しますか?

ありがとう

4

2 に答える 2

3

複数のトランザクション ハンドラを使用するには、修飾子を指定して参照するだけです。2 つの異なるデータソースを持つ 2 つの異なる DAO の場合、2 つの異なるトランザクション マネージャーが必要になります。そしてもちろん、トランザクションは直接 DAO ではなく、サービス クラスで行われる必要があります。休止状態であろうと普通の古いjdbcであろうと、どのタイプのトランザクションマネージャーでも同じです。

<bean id="transactionManagerOne"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager"
        p:sessionFactory-ref="sessionFactoryOne">
        <qualifier value="One" />
    </bean>

とセッションファクトリー

<bean id="sessionFactoryOne"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
        p:dataSource-ref="dataSourceOne"

ID dataSourceOne を使用してデータソースを設定するだけで、修飾子 name を使用してコードで transactionmanager を参照できます。

@Transactional(value = "One")
于 2012-10-16T15:15:37.077 に答える
1

部分的な回答を提供できます。通常、PlatformTransactionManagerSpring を使用する場合、作成時に単一のデータソースに関連付けられていました。このようなもの:

@Bean public PlatformTransactionManager txManager() { 
  return new HibernateTransactionManager(sessionFactory()); 
}

SessionFactoryデータソースで構成されます。複数PlatformTransactionManagerの s が必要な場合は、上記のように Bean として自動配線することに頼ることはできないと思います。代わりにクラスを使用TransactionTemplateし、わずかに低いレベルでコーディングする必要がある場合があります。

于 2012-10-16T15:07:11.623 に答える