0

私はこの状況を持っています:

@Component @Transactional
public class Test{

     public void mainMetod(){
        //do some changes on db

        classA.method1();

        classA.method2();
     }  

}

@Component @Transactional
public class A{

      public method1(){
           //read some data from db that Test class wrote
      }


      public method2(){
           //read some data from db that Test class wrote 
      }
}

および app-jpa-config.xml

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <!-- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> -->
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven />

私はこの動作を実装しようとしています:

  • クラス A の method1 が Test クラスの mainMetod に書かれたデータを参照できるようにしたい
  • method1 に例外がある場合、ロールバックは method1() によって行われた変更のみに関心があり、Test クラスの mainMethod によって行われた変更をロールバックしないことを望みます。Test クラスの mainMethod によって書き込まれた更新されたデータを読み取る必要があります
  • method2 に例外がある場合、ロールバックは method2() によって行われた変更のみに関心があり、Test クラスの mainMethod によって行われた変更をロールバックしないことを望みます。Test クラスの mainMethod によって書き込まれた更新されたデータを読み取る必要があります

デフォルトの伝播を使用すると、最初のリクエストに到達します (mainmethod によって書き込まれたデータを読み取ることができます) が、2 番目のリクエストを達成できません: method1/2 でのロールバック トランザクション全体をロールバックします。

伝搬 REQUIRES_NEW を使用すると、2 番目の要求は達成されますが、1 つは達成されません。

唯一の方法は、TransactionTemplate を使用した手動トランザクションを使用することだと思います。私の推測は正しいですか?

4

1 に答える 1

0

ネストされたトランザクション アノテーションは、Hibernate ではサポートされていません。したがって、私が見つけた問題を解決する唯一の方法は、TransactionTemplate を使用することです。

transactionTemplate.execute(new TransactionCallback<Void>() {

        @Override
        public Void doInTransaction(TransactionStatus status) {
}
});

doInTransaction メソッド内のすべてのコードは、トランザクション コンテキストで実行されます。したがって、このようにして、メソッドがコミットされる正確なポイントを手動で管理できます。

これが役立つことを願っています

于 2014-01-07T17:57:55.463 に答える